Task.WaitAll Index Out of Bounds Exception Cause

Rex*_*dan 2 c# task aggregateexception

为什么这不完整?相反,它抛出一个异常,就像没有捕获异常一样.而且,"索引超出数组范围"的例外对我来说没有意义.

        int n = 3;
        string[] names = new string[] { "sally", "fred", "gina" };
        Task[] myTasks = new Task[n];
        for (int y = 0; y < n; y++)
        {
            myTasks[y] = Task.Factory.StartNew(() =>
            {
                Action<string> action = (name) =>
                {
                    try
                    {
                        throw new Exception(name + ", I bet you can't catch me.");
                    }
                    catch (Exception e)
                    {
                        //I caught you... didn't I?
                    }
                };
                action(names[y]);
            });
        }

        Task.WaitAll(myTasks);
        Console.WriteLine("All tasks complete.");//This line is never reached;
Run Code Online (Sandbox Code Playgroud)

Col*_*ith 7

你在StartNew括号内的lambda函数正在形成一个闭包,它正在"捕获"外部变量" y"...它在循环迭代期间不会访问它的值......而是在捕获时在该lambda函数中访问变量...当它试图获取值时.

你的" y"变量最终得到值"3"(通过循环y++)....因为这导致"循环创建你的"动作")....退出(即3不小于3 ).

但是当Task你创建的任何s正在执行该行时,action(names[y])它正在访问已关闭的变量" y"..."可能"已经达到"3"......并且"3"不是数组中的有效索引....这一切都取决于这些任务的安排有多快或多慢,无论你是否遇到问题......一个典型的竞争条件.