我有多个任务,每个任务都从给定的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
实现这一目标的更好方法?
考虑在链表上使用Parallel.ForEach
。这看起来会为您省去很多麻烦。
由于变量闭包,您应该在循环主体中声明在 lambda 表达式中捕获的变量。否则,任务对first
变量的读取将遇到主线程对其后续更新的争用条件。
first = linkedList.First;
while (iterator != null)
{
// ...
var current = first;
Task.Factory.StartNew(() => run(current));
// ...
}
采用object
参数的适当StartNew
方法将状态传递给任务。闭包会自动对以这种方式传递给任务的数据执行。