任务启动过程中变量的变化

本文关键字:变化 变量 过程中 任务启动 | 更新日期: 2023-09-27 18:13:13

我真的很困惑。我运行以下代码来执行两个任务,它们在不同的文件夹上工作,这就是为什么我给它们index。不幸的是,当我运行下面的代码时,传递给ProcessingTask静态方法的索引总是2…

        tasks = new Task[sets.ThreadCount];
        for (int i = 0; i < sets.ThreadCount; i++)
        {
            tasks[i] = Task.Factory.StartNew
                (
                 () =>
                 {
                     ProcessingTask.run(
                                         i,
                                         stack,
                                         collector,
                                         sets,
                                         cts.Token,
                                         LOG
                                        );
                 },
                 cts.Token,
                 TaskCreationOptions.LongRunning,
                 TaskScheduler.Default
                );
        }

任何想法?

任务启动过程中变量的变化

您应该将i放入一个临时变量中并使用它,即

int iTemp = i;
tasks[i] = Task.Factory.StartNew(() => {
        ProcessingTask.run(
                             iTemp,
                             stack,
                             collector,
                             sets,
                             cts.Token,
                             LOG
                            );
     },
     cts.Token,
     TaskCreationOptions.LongRunning,
     TaskScheduler.Default
    );

见http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx