Task.WaitAll没有等待 - 解释

时间:2014-05-26 11:01:58

标签: c# .net asynchronous

以下代码(LINQPad示例)预计会创建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");
        }));
}

1 个答案:

答案 0 :(得分:5)

我相信,因为异步lambda(没有强制转换)返回Task,C#编译器选择接受Func<Task>委托的Task.Run()方法的重载。如果将委托转换为Action,则编译器会选择接受Action的重载,并且在调用Task.Delay()方法时,DoWork()方法返回的任务结束。结果是Task.WaitAll()方法在Task.Delay()任务完成之前结束。