具有链接列表节点的任务



我有多个任务,每个任务都从给定的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方法将状态传递给任务。闭包会自动对以这种方式传递给任务的数据执行。

相关内容

  • 没有找到相关文章

最新更新