【发布时间】:2020-08-01 01:06:06
【问题描述】:
我们有类似下面的东西
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)
);
然后就可以了。
但是,我想知道
- 为什么会卡住?
- 有什么方法可以保持工作流(创建任务而不直接触发它们并稍后启动它们)并且仍然能够利用
WaitAll()?
【问题讨论】:
-
您能否提供更多背景信息,为什么要在开始之前创建任务?
-
@GuruStron 好吧,不一定要那样。我只是在重构一些代码,不小心遇到了这个问题。实际的代码非常混乱,所以我正在考虑重构的范围,很高兴知道这是一种解决方法,所以如果我的重构计划落后于计划,我仍然可以交付一些东西。
-
你为什么使用
new Task(...).Start()? -
Task构造函数不知道Task返回方法。
标签: c# async-await task-parallel-library