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