我正在尝试在while循环中使用TPL,我需要将一些值传递给任务,然后将这些值更改为循环。例如,这里显示了一个索引递增的示例(必须在请求创建任务的行之后):
int index = 0;
Task[] tasks;
while(/*condition*/)
{
tasks[index] = Task.Factory.StartNew(() => DoJob(index));
index++;
}
但它当然不起作用,因为索引值可以在任务开始之前递增。一种可能的解决方案是也传递一个WaitHandle,在递增索引之前等待,并且必须用信号通知给DoJob方法,但在我看来这不是一个真正好的解决方案。还有别的主意吗?
发布于 2011-03-26 19:19:51
将该值赋给循环内的临时变量:
int index = 0;
Task[] tasks;
while(/*condition*/)
{
int value = index;
tasks[index] = Task.Factory.StartNew(() => DoJob(value));
index++;
}
这样,每个任务都将拥有index
在while
循环迭代期间拥有的值的自己的副本,在该循环中调用StartNew
。
https://stackoverflow.com/questions/5444673
复制