一,问题
最近有水友提了个问题。
Task task = Task.Factory.StartNew(async () =>
{
while (true)
{
await Task.Delay( 1000);
}
}
Task.WaitAll(new Task[] { task });
结果运行到await Task.Delay( 1000);直接跳出了while,导致 Task.WaitAll完成了,这是怎么回事,
await Task.Delay( 1000); 改成Thread.Sleep(1000)就正常了
二,解答
sp1234回答了,
果真,听君一席话,胜读十年书!
三,测试
static void Main(string[] args)
{
test();
Console.WriteLine("按任意键结束........");
Console.ReadKey();
}
private static async void test()
{
var task = Task.Run(async () =>
{
while (true)
{
await Task.Delay(1000);
Console.Write(".");
}
});
await Task.WhenAll(task);
Console.WriteLine("完成");
}
private static async void test1()
{
var task = Task.Factory.StartNew(async () =>
{
while (true)
{
await Task.Delay(1000);
Console.Write(".");
}
});
await Task.WhenAll(task);
Console.WriteLine("完成");
}
Task.Run
Task.StartNew
四,探究
我们先看一下:msdn说的
①,我们先把内部委托的async 去掉。
看一下返回类型。
Task.Run
Task.Factory.StartNew
②,我们在看看async action()
Task.Run
Task.Factory.StartNew
五,总结
1,调用Unwrap()方法,Task.Factory.StartNew(async action()).Unwrap() 可以实现和Task.Run(async action()) 一样的功能。
2,推荐大家看一下这篇博客,很详细:https://www.cnblogs.com/qinjin/p/Task-Run-Vs-Task-Factory-StartNew.html