为了账号安全,请及时绑定邮箱和手机立即绑定

任务清单没有给我我所期望的

任务清单没有给我我所期望的

C#
蝴蝶不菲 2021-05-17 17:18:49
运行以下命令时,任务#{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));

不知道我在解释这一点上做得很好,但是我希望它能对您有所帮助。


查看完整回答
反对 回复 2021-05-23

添加回答

代码语言

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号