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

时间:2011-03-26 19:14:59

标签: c# task task-parallel-library

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

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

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

1 个答案:

答案 0 :(得分:17)

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

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

这样,每个任务都会拥有indexwhile循环的迭代过程中所拥有的值的副本,其中StartNew调用{{1}}。