我正在尝试使用任务并行库为一系列项目调度函数调用。
以下不起作用
List<Task> tasks = new List<Task>();
foreach(var someValue in aCollection)
{
var t = Task.Factory.StartNew(() => DoSomeWork(someValue));
tasks.Add(t);
}
Task.WaitAll(tasks.ToArray());
但下面的作品
Task.WaitAll(aCollection.Select(a => Task.Factory.StartNew(() => DoSomeWork(a))).ToArray());
对于第一种方法,它执行一次然后停止。我不确定它是否覆盖了引用或其他内容。有人可以。解释
还有一种方法可以将一些序列号传递给Task,可用于识别首先安排了哪个任务。我的意思是我想等待所有任务完成,然后根据集合中的顺序对结果进行排序。
答案 0 :(得分:5)
我不知道这是否导致执行停止,但也许是因为你在这里closing over the loop variable:
DoSomeWork(someValue));
您需要创建一个局部变量并为其分配someValue
,然后使用该局部变量,如我的链接问题中所述,如下所示:
foreach(var someValue in aCollection)
{
var localCopy = someValue;
var t = Task.Factory.StartNew(() => DoSomeWork(localCopy));
tasks.Add(t);
}
同样,我不知道这是否是您的死锁问题,但这是一个很可能会导致问题的问题。