我有以下实用程序:
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但它似乎没有用,关于如何使主方法成为交互的唯一控制器的任何想法?