如何等待异步调用完成?

时间:2011-11-24 14:49:03

标签: c# silverlight-4.0 asynchronous

假设我有两个事件A和B.每个事件都会引发一个异步调用,比如AsyncA和AsyncB。

我想要的是:当A只在AsyncB完成时调用AsyncA时。

事件A和B按顺序触发:A,然后B. 我希望AsyncA在AsyncB完成之前完成,但实际上,大部分时间,AsyncB都是在AsyncA之前完成的。

我无法在AsyncA完成事件中调用AsyncB。 如何确保AsyncB始终在AsyncA之后?

3 个答案:

答案 0 :(得分:0)

如果顺序很重要,则异步方法调用不合适。

答案 1 :(得分:0)

只要两个调用都是异步运行,控制它们的顺序就超出了你的能力范围。这是由调度程序完成的。

但你可以使用TPL使它们同步运行:

System.Threading.Tasks.Task.Factory.StartNew( ( ) => OnAsyncA() )
    .ContinueWith( ( t ) => OnAsyncB() );

答案 2 :(得分:0)

您不能保证异步调用的完成顺序,但您可以按照所需的顺序执行要执行的工作。您需要的是一种同步方式。

OnAsyncA中你需要:

  1. 完成您需要完成的工作,并在必要时保存OnAsyncB
  2. 所需的信息
  3. 设置等待句柄(例如ManualResetEventAutoResetEvent)。
  4. OnAsyncB

    1. 保存所需的任何信息(例如结果)。
    2. Spawn a threadpool thread。 (等待处理程序中的信号将是一个坏主意,因为在UI线程上发生WCF回调)。
    3. 在线程池线程中,

      1. 等待手柄。
      2. 执行您通常为OnAsyncB完成的工作。
      3. 此处还有其他变体,例如使用TPL等从“依赖事件”队列中出发的较长运行线程,等等。

        请记住从线程池线程同步回UI线程。