我试图了解等待和异步,所以我编写了这个小测试应用程序,但我预期的情况并没有发生。
程序不会等待任务完成,而是继续执行。
class Program
{
static void Main(string[] args)
{
var task = new Task(Run);
task.Start();
task.Wait();
Console.WriteLine("Main finished");
Console.ReadLine();
}
public async static void Run()
{
var task = Task.Factory.StartNew(() =>
{
Console.WriteLine("Starting");
Thread.Sleep(1000);
Console.WriteLine("End");
});
await task;
Console.WriteLine("Run finished");
}
}
Output
Main finished
Starting
End
Run finished
如果我将“等待任务”替换为“task.Await()”,它将按照我预期的方式运行
Starting
End
Run finished
Main finished
那是因为当你有异步时void
方法,您无法执行任何操作来跟踪其完成情况。你的new Task(Run)
只创建一个用于启动 Run 方法的任务。 Run到达第一个await后,没有任何东西跟踪方法的进度,因为没有任何东西与方法的进度相关。要修复它,您必须返回Task
代替void
并等待,而不是创建新任务。
之间的区别async void
and async Task
被描述here http://msdn.microsoft.com/en-us/magazine/jj991977.aspx.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)