13

我正在试验任务。为什么这个输出 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();                       
    }       
}
4

2 回答 2

20

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

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

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();                       
    }       
}
于 2012-12-09T03:34:31.127 回答
5

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

    using System;
    using System.Threading.Tasks;

    static void StartTasks(int instances)
    {
        var tasks = new Task[instances];
        for (int i = 0; i < instances; i++)
        {
            tasks[i] = new Task((object param) =>
            {
                var t = (int)param;
                Console.Write("({0})", t);
            }, i);
        }

        Parallel.ForEach<Task>(tasks, (t) => { t.Start(); }); 
        Task.WaitAll(tasks);
    }
于 2017-05-23T23:23:29.583 回答