在循环内启动任务:如何传递可在循环内更改的值?

Mau*_*wer 7 c# task task-parallel-library

我试图在while循环中使用TPL,我需要将一些值传递给任务然后更改为循环.例如,这里显示了一个增加索引的示例(必须在请求创建任务的行之后):

int index = 0;
Task[] tasks;
while(/*condition*/)
{
    tasks[index] = Task.Factory.StartNew(() => DoJob(index));
    index++;
}
Run Code Online (Sandbox Code Playgroud)

但当然它不起作用,因为索引值可以在任务开始之前递增.一个可能的解决方案可能是在递增索引之前传递一个等待的WaitHandle,并且必须在DoJob方法中发出信号,但在我看来这不是一个非常好的解决方案.还有其他想法吗?

Fre*_*örk 17

将值分配给循环内的临时变量:

int index = 0;
Task[] tasks;
while(/*condition*/)
{
    int value = index;
    tasks[index] = Task.Factory.StartNew(() => DoJob(value));
    index++;
}
Run Code Online (Sandbox Code Playgroud)

这样,每个任务都将拥有自己的值副本,该副本indexwhile循环的迭代期间进行调用StartNew.