首页 > 解决方案 > C# 多参数异步任务

问题描述

我需要并行运行任务并向它们传输大约 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);
    }

}

在此处输入图像描述

标签: c#task

解决方案


这是一个“捕获的变量”问题;改为尝试:

for (int i = 0; i < 100; i++)
{   
    var copy = i;
    Task.Factory.StartNew(() => action(file_name, copy)); 
}

这里的基本问题是您的操作是捕获变量 i,而不是特定时间的值。i所以发生的事情是:你的循环非常快地完成(在线程池甚至还没有穿鞋之前),并i100. 在某个不确定的时间,线程池开始处理您的工作项,并且所有这些都i处于100等待状态。注意:在技术上可以获得更早的数字,但这最终是一个巨大的竞争条件。

此处的修复将捕获变量的声明移动到循环内部;变量的声明定义了捕获变量的范围,因此现在每个变量copy都独立于其他变量。


推荐阅读