明确等待异步操作完成?

时间:2012-02-13 00:25:24

标签: mvvm asynchronous callback wait synchronous

我有以下实用程序:

class Worker
{
  public void DoWorkAsync(Action callback)
  {
    Action work = () => Thread.Sleep(3000);
    AsyncCallback asyncCallback = (result) => callback();
    work.BeginInvoke(asyncCallback, null);
  }
}

我使用它如下:

static void Main(string[] args)
{
  var worker = new Worker();
  worker.DoWorkAsync(() => Console.WriteLine("Completed."));

  Console.WriteLine("Hello world!");
  Console.ReadKey();
}

这当然会在Hello world!之前打印Completed.,因为工作人员是异步工作的。

我的问题是如何阻止我的线程,所以它应该等到动作完成后再继续。

我知道我可以这样做:

static void Main(string[] args)
{
  var worker = new Worker();
  worker.DoWorkAsync(() =>
    {
      Console.WriteLine("Completed.");
      MoveOn();
    });

  Console.ReadKey();
}

static void MoveOn()
{
  Console.WriteLine("Hello world!");
}

但是由于我有一堆级联的异步回调应该一个接一个地执行(有条件地),我希望它们全部执行同步,所以有更优雅的方式等待将回调作为参数的异步方法?

注意:为了确保,我无法改变Worker类的行为,它是一个外部实用程序,我无法访问其代码。

更新

在我的特定场景中,我正在尝试与ViewModel中的用户进行交互并获得他的回复。我的代码在视图模型中执行,并且有一个控制级联交互链的方法,我希望这个方法应该决定是否触发某个交互。我尝试了SLaxs' answer,并尝试this但它似乎没有用,关于如何使主方法成为交互的唯一控制器的任何想法?

1 个答案:

答案 0 :(得分:4)

创建ManualResetEvent,在回调中调用Set(),然后致电WaitOne()等待操作完成。