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 都独立于其他变量。