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

运行以下命令时,任务#{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("");

}


蝴蝶不菲
浏览 128回答 2
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) => {&nbsp; &nbsp; cb.Add(j);&nbsp; &nbsp; Console.WriteLine("Task #{0} created on {1}",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; j, Thread.CurrentThread.ManagedThreadId);&nbsp; &nbsp; Thread.Sleep(10);}, , i));不知道我在解释这一点上做得很好,但是我希望它能对您有所帮助。
打开App,查看更多内容
随时随地看视频慕课网APP