如何以同步方式调用Async API?

时间:2014-09-10 02:38:00

标签: c# .net vb.net multithreading

假设您有一个具有

的典型异步设计模式API
  1. 一种名为Start的方法,用于启动异步进程
  2. 流程完成时调用的回调
  3. 如何使用.NET 3.5以同步方式调用此API,而不会在调用期间阻止消息泵?

1 个答案:

答案 0 :(得分:1)

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

使用async和await:

// 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调用T2的结果。

这是非常人为的:

  1. 异步方法的意图是异步执行,可能是因为它需要相当长的时间才能完成。
  2. 任务T1允许UI继续调用代码的下一行(与使用注册延续的UI线程的async / await相反。但现在你可能需要以其他方式从T1获取结果。