gpt4 book ai didi

c# - Task.WaitAll 没有等待 - 解释

转载 作者:太空狗 更新时间:2023-10-30 01:04:19 25 4
gpt4 key购买 nike

以下代码(LINQPad Sample)预计会创建 5 个工作任务并等待所有任务完成。

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

问题是 (Action) - 在 Task.Run 之后进行转换。如果我删除该类型转换,一切都会按预期进行。

这里发生了什么?这对我来说没有任何意义,因为在我看来 Actor 阵容是多余的。

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");
}));
}

最佳答案

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

关于c# - Task.WaitAll 没有等待 - 解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23868619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com