我有一个非常简单的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”所迷惑。