我试图让自己等待和异步,所以我编写了这个小测试应用程序,但是我没有想到的结果。
该程序将继续执行,而不是等待任务完成。
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
如果我将“等待任务”替换为“ task.Await()”,则它将按预期运行
Starting
End
Run finished
Main finished
那是因为当您拥有异步void
方法时,您无法采取任何措施来跟踪其完成情况。您new Task(Run)
只创建一个用于启动Run方法的任务。在首次等待运行到达后,将没有任何方法跟踪方法的进度,因为没有与方法进度相关的信息。要解决此问题,您必须返回Task
而不是void
等待它,而不是创建新的Task。
async void
和之间的区别在这里async Task
描述。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句