如何以同步方式调用异步API

本文关键字:调用 异步 API 方式 同步 | 更新日期: 2023-09-27 18:21:21

假设您有一个典型的异步设计模式API,它有

  1. 一个名为Start的方法,用于启动异步进程
  2. 进程完成时调用的回调

如何使用.NET 3.5以同步方式调用此API而不在调用过程中阻塞消息泵?

如何以同步方式调用异步API

如果你想等待结果(同步调用),但又不想阻止消息泵(假设你指的是UI线程),你必须使用一个单独的线程来进行调用(并等待它)

使用异步和等待:

// current thread is the UI thread
// so create/use a Task to wait for the call
var task = Task.Factory.StartNew( () => { DoJobAsync().Wait()});

UI线程创建一个Task(T1)并立即返回。T1运行在不同的线程上。这个线程调用一个异步函数(它返回另一个任务T2),以便等待异步T1调用wait on T2的结果。

这很做作:

  1. 异步方法的目的是异步执行,可能是因为它需要相当长的时间才能完成
  2. 任务T1允许UI继续调用代码的下一行(而不是使用注册继续的UI线程的async/await。但现在你可能需要通过其他方式从T1获得resulks