У меня есть следующий метод:
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
) для вызова анонимного делегата?