我试图让我的头脑等待和异步,所以我写了这个小测试应用程序,但我的预期不会发生。
程序继续执行,而不是等待任务完成。
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");
}
}
输出
Main finished
Starting
End
Run finished
如果我更换等待任务' for' task.Await()'它然后运行,因为我期望生产
Starting
End
Run finished
Main finished
答案 0 :(得分:5)
这是因为当你使用异步void
方法时,你无法做任何事情来跟踪它的完成情况。你的new Task(Run)
只创建一个启动Run方法的任务。在Run到达await之后,没有任何东西跟踪方法的进度,因为没有任何东西与方法的进度相关联。要解决此问题,您必须返回Task
而不是void
并等待,而不是创建新任务。
async void
和async Task
之间的差异被描述为here。