Почему C # не сохраняет контекст для вызовов анонимного делегата?

У меня есть следующий метод:

static Random rr = new Random();
static void DoAction(Action a)
{
    ThreadPool.QueueUserWorkItem(par =>
    {
        Thread.Sleep(rr.Next(200));
        a.Invoke();
    });
}

теперь я вызываю его в цикле for следующим образом:

for (int i = 0; i < 10; i++)
{
    var x = i;

    DoAction(() =>
    {
        Console.WriteLine(i); // scenario 1
        //Console.WriteLine(x); // scenario 2
    });
}

в сценарии 1 результат будет: 10 10 10 10 ... 10
в сценарии 2 вывод следующий: 2 6 5 8 4 ... 0 (случайная перестановка от 0 до 9)

Как вы это объясните? Разве C # не должен сохранять переменные (здесь i ) для вызова анонимного делегата?

5
задан Mo Valipour 13 January 2012 в 16:30
поделиться