运行以下命令时,任务#{0}和cb的值为100如果我在循环中逐行调试,那么我会得到正确的答案。如何解决这个问题?public static void TaskList(){ ConcurrentBag<int> cb = new ConcurrentBag<int>(); List<Task> taskArray = new List<Task>(); for (int i = 0; i < 100; i++) { taskArray.Add(Task.Factory.StartNew((Object obj) => { int j = 0 + i; cb.Add(j); Debug.WriteLine("Task #{0} created on {1}", j, Thread.CurrentThread.ManagedThreadId); Thread.Sleep(10); }, i)); } Task.WaitAll(taskArray.ToArray()); foreach(var v in cb) { Debug.WriteLine(v); } Debug.WriteLine("");}
2 回答

一只斗牛犬
TA贡献1784条经验 获得超2个赞
您100几乎可以看到每次运行都打印输出,因为i在运行任务时,以下行中的等于100:
int j = 0 + i;
我相信您正在尝试减轻int j = 0 + i生产线中的此问题,但是由于i更改的是,j它将始终等同于i运行任务时的情况。如果指定的值i到j 外面你的任务,那么你就不会看到这个问题:
int j = i;
taskArray.Add(Task.Factory.StartNew((Object obj) => {
cb.Add(j);
Console.WriteLine("Task #{0} created on {1}",
j, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(10);
}, , i));
不知道我在解释这一点上做得很好,但是我希望它能对您有所帮助。
没有找到匹配的内容?试试慕课网站内搜索吧
- 2 回答
- 0 关注
- 127 浏览
添加回答
举报
0/150
提交
取消