从 for 循环初始化任务时提供的 C# 参数不正确

C# Incorrect arguments supplied when initializing tasks from a for loop

我一直在努力熟悉 C# 中的任务库和一般的并行性。我的 newMethodForThreads() 方法给出了一个错误,指示该线程正在尝试访问另一个线程已打开的文件。

在尝试对此进行调试时,createTasks() 中的 for 循环似乎在不同的迭代中将相同的参数传递给 newMethodForThreads()。似乎 i 的某些迭代也没有传递到任务中,而是被完全跳过。有人知道这是怎么回事吗?

public static List<Task> createTasks(int x)
{

    List<Task> taskList = new List<Task>();

    for (int i = 1; i <= x; i++)
    {
        taskList.Add(Task.Factory.StartNew(() => newMethodForThreads(i)));
    }

    return taskList;
}


public static void newMethodForThreads(int i)
{
    File.WriteAllLines($"C:\Users\my_username\Desktop\Shenanigans\Threadedfile{i}.txt", list);
    Console.WriteLine($"File Threadedfile{i}.txt finished.");
}

问题是任务引用了整数。因此它将使用整数在开始任务时而不是在创建任务时具有的值。

要修复它,请在创建任务之前将整数分配给局部变量。

        for (int i = 1; i <= x; i++)
        {
           var localValue = i;
           taskList.Add(Task.Factory.StartNew(() => newMethodForThreads(localValue)));
        }