所以我仍在努力理解异步/等待模式,但我也在努力实现以下行为:
方法 A 调用运行多个进程的方法 B。其中一些进程可以在单独的线程上运行,同时处理其他事情,以便它们的返回值在需要时更接近可用。在所有这些过程完成之前,方法 B 不需要将控制权返回给调用者。
这是我正在使用的测试代码:
static void Main(string[] args)
{
CallProc();
Console.WriteLine("Program finished");
Console.ReadKey();
}
public static async Task CallProc()
{
var two = Task.Factory.StartNew(() => SomeSynchronousProcessIDontOwn(5000, "two"));
var one = Task.Factory.StartNew(() => SomeSynchronousProcessIDontOwn(500, "one"));
var three = Task.Factory.StartNew(() => SomeSynchronousProcessIDontOwn(1500, "three"));
// some process happens here
var oneMessage = await one; // waits until one finishes and then snags it's value
Console.WriteLine("Got message {0}", oneMessage);
// some more stuff happens here
var twoMessage = await two; // waits until two is finished and then snags it's value
Console.WriteLine(twoMessage);
// TODO: need to make sure that everything is completed before returning control to caller
}
public static string SomeSynchronousProcessIDontOwn(int delayTime, string message, bool delay = true)
{
Console.WriteLine("Starting \"{0}\"", message);
if(delay) Thread.Sleep(delayTime);
return string.Format("Finished \"{0}\"", message);
}
现在,发生的事情是一切如我所料,除了方法在一切完成之前返回,所以输出显示“程序完成”,而“两个”仍在运行。
我该如何编写,以便 CallProc()
可以异步执行这些任务,但延迟返回,直到一切都完成。也就是说,CallProc()
需要异步运行一些任务,但是CallProc()
本身需要同步调用。
最佳答案
您编写的异步方法的想法是,它将立即(大约)返回控制权,并且当它在概念上表示的操作完成时,它返回的任务将被标记为已完成。
这意味着您的程序应该查看生成的任务以查看它何时完成,或者您首先不想要异步方法,并且您应该重写 CallProc
同步而非异步。
要使 CallProc
同步,只需删除 async
(并相应地调整返回类型),然后等待每个任务而不是使用 await
。
如果 CallProc
确实应该是异步的,那么调用者应该添加一个延续(或使用 await
)来在任务完成时执行操作,而不是在任务完成时方法返回。
关于c# - 在所有任务完成之前防止异步方法返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25024353/