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