的任务.WaitAll没有在等待-解释

本文关键字:在等待 解释 任务 WaitAll | 更新日期: 2023-09-27 18:05:04

下面的代码(LINQPad Sample)期望创建5个工作任务,并等待它们全部完成。

相反,它启动5个任务并立即输出"... Done" -消息。

问题是(Action) - cast在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");
        }));
}

的任务.WaitAll没有在等待-解释

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