我正在尝试在while循环中使用TPL,我需要将一些值传递给任务然后更改为循环。例如,这里显示了一个增加索引的示例(必须在请求创建任务的行之后):
int index = 0;
Task[] tasks;
while(/*condition*/)
{
tasks[index] = Task.Factory.StartNew(() => DoJob(index));
index++;
}
但当然它不起作用,因为索引值可以在任务开始之前递增。一个可能的解决方案可能是在递增索引之前传递一个等待的WaitHandle,并且必须在DoJob方法中发出信号,但在我看来这不是一个非常好的解决方案。还有其他想法吗?
答案 0 :(得分:17)
将值分配给循环内的临时变量:
int index = 0;
Task[] tasks;
while(/*condition*/)
{
int value = index;
tasks[index] = Task.Factory.StartNew(() => DoJob(value));
index++;
}
这样,每个任务都会拥有index
在while
循环的迭代过程中所拥有的值的副本,其中StartNew
调用{{1}}。