tho*_*mai 4 .net c# asynchronous
以下代码(LINQPadSample)应该创建5个工作任务,并等待所有任务完成.
相反,它启动5个任务并立即输出"... Done"- 消息.
问题是(Action)- 演员之后Task.Run.如果我删除该演员表,一切都按预期工作.
这里发生了什么?这对我没有任何意义,因为在我看来演员是多余的.
void Main()
{
var tasks = Enumerable.Range(1, 5).Select(x => this.DoWork()).ToArray();
Console.WriteLine("Waiting ... ");
Task.WaitAll(tasks);
Console.WriteLine("... Done");
}
Task DoWork()
{
return Task.Run(
(Action)(async () =>
{
Console.WriteLine("Task start");
await Task.Delay(3000);
Console.WriteLine("Task end");
}));
}
Run Code Online (Sandbox Code Playgroud)
我相信,这是因为异步lambda(没有强制转换)返回Task,C#编译器选择接受Func<Task>委托的Task.Run()方法的重载.如果将委托转换为Action,则编译器会选择接受Action的重载,并且在Task.Delay()调用方法时,DoWork()方法返回的任务结束.结果是该Task.WaitAll()方法在Task.Delay()任务完成之前结束.