我有多个任务,每个任务都从给定的LinkedListNode
开始。像这样:
first = linkedList.First;
int counter = 0;
while (iterator != null) {
counter++;
if (counter == threshold) {
Task.Factory.StartNew(() => run(first, iterator));
counter = 0;
first = iterator.Next;
}
iterator = iterator.Next;
}
我的想法是,我想要运行LinkedList
而不是因为内存要求而将其转换为数组。所以,我想我只是在开始和结束时传递并迭代它。
当我的任务实际开始时,看起来这些参数就是他们在循环中停止的地方。有没有什么方法可以在变量上形成闭包,以便任务从LinkedList
的正确节点开始?
或者,也许是使用LinkedList
实现此目标的更好方法?
答案 0 :(得分:3)
请考虑在链接列表中使用Parallel.ForEach
。这看起来会为您省去很多麻烦。
答案 1 :(得分:2)
由于变量闭包,您应该声明在循环体中的lambda表达式中捕获的变量。否则,任务对first
变量的读取将遇到竞争条件,主线程的后续更新将会发生。
first = linkedList.First;
while (iterator != null)
{
// ...
var current = first;
Task.Factory.StartNew(() => run(current));
// ...
}
答案 2 :(得分:1)
您可以将状态传递给任务through the appropriate StartNew
method which takes an object
parameter。对以这种方式传递给任务的数据自动执行闭包。