数组中的任务 - 只运行最后一个

时间:2012-12-09 03:23:54

标签: c#

我正在尝试任务。为什么输出10而不是循环的每个值?

public static void StartTasks()
{
    Task[] tasks = new Task[10];
    for (int i = 0; i < 10; i++)
        tasks[i] = new Task(() => Console.WriteLine(i));

    foreach (Task task in tasks)
    {
        task.Start();                       
    }       
}

2 个答案:

答案 0 :(得分:17)

C#lambdas捕获对变量的引用,而不是变量的值。

如果要捕获该值,则需要首先在循环内复制它,这会导致捕获获取对本地范围的不变变量的引用。

public static void StartTasks()
{
    Task[] tasks = new Task[10];
    for (int i = 0; i < 10; i++) {
        int j = i;
        tasks[i] = new Task(() => Console.WriteLine(j));
    }

    foreach (Task task in tasks)
    {
        task.Start();                       
    }       
}

答案 1 :(得分:4)

除了接受的答案,您还可以将参数传递给任务。例如,

Host