C# 多参数异步任务
C# Asynchronous task with multiple parameters
我需要 运行 并行任务并向它们传递大约 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);
}
}
这是一个“捕获变量”问题;试试看:
for (int i = 0; i < 100; i++)
{
var copy = i;
Task.Factory.StartNew(() => action(file_name, copy));
}
这里的根本问题是您的操作捕获的是 变量 i
,而不是 [=11] 的 值 =] 在特定时间。所以会发生什么:你的循环完成 非常快 (在 thread-pool 甚至穿上鞋子之前),并且 i
结束于 100
. 在某个不确定的时间 thread-pool 开始处理您的工作项,并且 i
坐在 100
处处理所有这些工作项。注意:从技术上讲,获得更早的数字是可能的,但这最终是一个巨大的竞争条件。
此处的修复将捕获变量的声明移至循环内部;变量的声明定义了捕获变量的范围,因此现在每个 copy
都独立于其他变量。
我需要 运行 并行任务并向它们传递大约 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);
}
}
这是一个“捕获变量”问题;试试看:
for (int i = 0; i < 100; i++)
{
var copy = i;
Task.Factory.StartNew(() => action(file_name, copy));
}
这里的根本问题是您的操作捕获的是 变量 i
,而不是 [=11] 的 值 =] 在特定时间。所以会发生什么:你的循环完成 非常快 (在 thread-pool 甚至穿上鞋子之前),并且 i
结束于 100
. 在某个不确定的时间 thread-pool 开始处理您的工作项,并且 i
坐在 100
处处理所有这些工作项。注意:从技术上讲,获得更早的数字是可能的,但这最终是一个巨大的竞争条件。
此处的修复将捕获变量的声明移至循环内部;变量的声明定义了捕获变量的范围,因此现在每个 copy
都独立于其他变量。