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



我一直在努力熟悉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.");
}

问题是任务有对整数的引用。因此,它将在taks启动时使用整数的值,而不是在taks创建时使用。

要解决这个问题,就在任务创建之前将整数赋给一个局部变量。

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

最新更新