帮助Task并行库使用

时间:2011-02-07 23:36:49

标签: c# c#-4.0 task-parallel-library

我正在尝试使用任务并行库为一系列项目调度函数调用。

以下不起作用

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,可用于识别首先安排了哪个任务。我的意思是我想等待所有任务完成,然后根据集合中的顺序对结果进行排序。

1 个答案:

答案 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);
}

同样,我不知道这是否是您的死锁问题,但这是一个很可能会导致问题的问题。