循环变量值未正确传递给任务

时间:2018-11-29 18:47:23

标签: c# multithreading task

我有一个非常简单的C#.NET多任务示例,但未产生预期的结果。 (我在Windows 10上使用Visual Studio 2017,这是一个.NET Console应用程序。)这是代码:

using System;
using System.Threading.Tasks;

namespace Multithreading_Example
{
    class Program
    {
        static void Main(string[] args)
        {
            Task[] tasks = new Task[3];

            for (int i = 0; i < 3; i++)
            {
                int n = i;
                tasks[i] = Task.Run(() => TestTask(i, n));
            }
            Console.ReadLine();
        }

        static void TestTask(int taskNum, int n)
        {
            Console.WriteLine("{0} {1}", taskNum, n);
        }
    }
}

以下是该程序打印的输出:

3 0
3 1
3 2

(由于任务是异步的,因此理论上三行输出可能以不同的顺序出现,但这很好。)TestTask()只是打印传递给它的两个整数。这两个整数应该相同-其中一个是循环变量“ i”,第二个是新的局部变量“ n”,其设置为与“ i”相同的值。换句话说,上面的程序应该(在我看来)产生以下输出:

0 0
1 1
2 2

但是,奇怪的是,当我运行程序时,TestTask()始终将“ 3”打印为第一个数字(请参见上面的实际输出)。为什么?感觉就像是编译器中的某种优化错误,这被传递给任务的循环变量“ i”所迷惑。

0 个答案:

没有答案