gpt4 book ai didi

c# - 使用 Task.Start 触发任务时卡在 Task.WaitAll(tasks.ToArray()) 处

转载 作者:行者123 更新时间:2023-12-03 08:38:49 24 4
gpt4 key购买 nike

我们有类似下面的内容

List<string> uncheckItems = new List<string>();
for (int i = 0; i < 100; i++)
{
uncheckItems.Add($"item {i + 1}");
}

var tasks = uncheckItems.Select(item =>
new Task(async () => await ProcessItem(item))
);

// Do some preparations

foreach (var task in tasks)
{
task.Start();
}

Task.WaitAll(tasks.ToArray());
Console.WriteLine("=====================================================All finished");

这似乎是有道理的,但程序永远无法到达全部完成线。如果我调整工作流程以立即运行任务,例如删除 task.Start() 循环并更改为

var tasks = uncheckItems.Select(async item =>
await ProcessItem(item)
);

然后就可以了。

但是,我想知道

  1. 为什么会卡住?
  2. 有什么方法可以保持工作流程(创建任务而不直接触发它们并稍后启动它们)并且仍然能够利用 WaitAll()

最佳答案

原因是lazy enumeration evaluation ,您正在启动与使用 Task.WaitAll 等待不同的任务。例如可以使用 next 来修复此问题:

var tasks = uncheckItems.Select(item =>
new Task(async () => await ProcessItem(item))
)
.ToArray();

尽管它不会实现您等待所有 ProcessItem 完成的目标(据我所知)。您可以执行类似 new Task(() => ProcessItem(item).GetAwaiter().GetResult()) 的操作,但我认为最好改变您的方法,例如 make ProcessItem 返回一个“冷”任务或使用您的第二个代码片段并将任务创建移动到需要启动的位置。

关于c# - 使用 Task.Start 触发任务时卡在 Task.WaitAll(tasks.ToArray()) 处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63189937/

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