帮助Task并行库使用

sta*_*ser 3 c# task-parallel-library c#-4.0

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

以下不起作用

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());
Run Code Online (Sandbox Code Playgroud)

但下面的工作

Task.WaitAll(aCollection.Select(a => Task.Factory.StartNew(() => DoSomeWork(a))).ToArray());
Run Code Online (Sandbox Code Playgroud)

对于第一种方法,它执行一次然后停止.我不确定它是否覆盖了引用或其他内容.有人可以.说明?

还有一种方法可以将一些序列号传递给Task,可用于识别首先安排的任务.我的意思是我想等待所有任务完成,然后根据集合中的顺序排序结果.

小智 5

我不知道这是否导致执行停止,但也许是因为你在这里关闭循环变量:

DoSomeWork(someValue));
Run Code Online (Sandbox Code Playgroud)

您需要创建一个局部变量并分配someValue给它,然后使用该局部变量,如我的链接问题中所述,如下所示:

foreach(var someValue in aCollection)
{
   var localCopy = someValue;

   var t = Task.Factory.StartNew(() => DoSomeWork(localCopy));
   tasks.Add(t);
}
Run Code Online (Sandbox Code Playgroud)

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