链接列表节点的任务

时间:2014-01-08 09:21:51

标签: c# .net multithreading closures

我有多个任务,每个任务都从给定的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实现此目标的更好方法?

3 个答案:

答案 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。对以这种方式传递给任务的数据自动执行闭包。