我不想问教科书的问题,但是我现在已经从2种不同的来源中读到了,但我还是不明白。下面的代码来自C#考试的学习指南。它指出,您必须将计数器的值复制到局部变量中,以便能够将正确的值传递到任务的lambda函数中。两个来源都说“您必须复制该值,因为限制为10”。我知道任务是异步的,但是我不知道如何将错误的值传递给它。如果我通过了计数器(在这种情况下为“ i”),会不会按值传递?
我已经阅读了多个资源,并亲自编写了示例代码。我知道他们说的是真的(有点),但我不明白为什么。我知道循环可以在任何任务开始之前完成,但并非总是如此。如果我将计数器直接传递到lambda表达式中,则在某些情况下,一些任务的值确实不是10,但通常它们都具有相同的值。因此,也许我最终完成了三个任务,其中传递了5个任务,七个任务,传递了10个任务。这几乎就像计数器是通过引用传递的。那是怎么回事?如果是这样,为什么?
public static void DoWork(int n) { Thread.Sleep(2000); }
public void Main(string[] args)
{
Task[] Tasks = new Task[10];
for (int i = 0; i < 10; i++)
{
int n = i;
Tasks[i] = Task.Run( () => DoWork(n) );
}
Task.WaitAll(Tasks);
}
我的期望是该数组中没有值(因为任务不返回值),并且每个任务都会将其给出的值写到控制台。数组部分的行为符合预期,但控制台输出不是我所想的。该参数(AFAIK)应该按值传递。对吧?