c# - 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);
}
}
解决方案
这是一个“捕获的变量”问题;改为尝试:
for (int i = 0; i < 100; i++)
{
var copy = i;
Task.Factory.StartNew(() => action(file_name, copy));
}
这里的基本问题是您的操作是捕获变量 i
,而不是特定时间的值。i
所以发生的事情是:你的循环非常快地完成(在线程池甚至还没有穿鞋之前),并i
在100
. 在某个不确定的时间,线程池开始处理您的工作项,并且所有这些都i
处于100
等待状态。注意:在技术上可以获得更早的数字,但这最终是一个巨大的竞争条件。
此处的修复将捕获变量的声明移动到循环内部;变量的声明定义了捕获变量的范围,因此现在每个变量copy
都独立于其他变量。
推荐阅读
- javascript - 错误消息:未捕获的 TypeError:items.appendChild 不是函数
- html - Bootstrap 4 中的中心图像和 div 底层
- grammar - 这个递归规则中的顺序如何不给出相同的结果?
- c++ - 如何将调试器附加到 google v8?
- c# - 动态母版页,可访问两个母版中的变量
- javascript - find() 伪元素 jquery
- android - 升级到 Android Pie 后代码抛出异常表不可用
- android - Osmdroid 从 wms geoserver 获取功能信息
- javascript - sequlize js中的日期差异
- php - 在使用 PHP 上传之前根据 EXIF 方向来定位图像