我需要并行运行任务并向它们传输大约 3-5 个参数,但现在我向任务传输了 2 个参数,因此,我总是在控制台中看到值 100。
告诉我我做错了什么?以及如何正确地将参数传递给任务?
class Program
{
static void Main(string[] args)
{
/// Init
string file_name = "unknown.dat";
Action<string, int> action = (msg, count) => Load(msg, count);
/// For
for (int i = 0; i < 100; i++)
{
Task.Factory.StartNew(() => action(file_name, i));
}
/// End
Console.Read();
}
public static void Load(string aFileName, int aCount)
{
Console.WriteLine("Index: {0} ", aCount);
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个“捕获变量”问题;改为尝试:
for (int i = 0; i < 100; i++)
{
var copy = i;
Task.Factory.StartNew(() => action(file_name, copy));
}
Run Code Online (Sandbox Code Playgroud)
这里的根本问题是,你的动作捕捉变量 i,而不是价值的i,在一个特定的时间。所以发生的事情是:你的循环非常快地完成(在线程池甚至穿上鞋子之前),并i在100. 在某个不确定的时间,线程池开始处理您的工作项,并且所有这些项i都处于100等待状态。注意:在技术上可以获得更早的数字,但这最终是一个巨大的竞争条件。
此处的修复将捕获变量的声明移至循环内部;变量的声明定义了用于捕获变量的范围,因此现在每个变量copy都独立于其他变量。
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |