Как лямбда функции преобразуются в ParameterizedThreadStart и ThreadStart
Разбирался с потоками и столкнулся со следующим.
Thread[] threads = new Thread[3];
for (int i = 0; i < 3; i++)
{
Thread.BeginCriticalRegion();
threads[i] = new Thread(x=>Func(i));
Thread.EndCriticalRegion();
}
for (int i = 0; i < 3; i++)
threads[i].Start();
void Func(int numThread)=>Console.WriteLine(numThread);
Вывод:
3
3
3
Думал из-за цикла i быстро становится 3 и все потоки создаются с Func(3), добавил критические секции, предполагая, что это изменит ситуацию, но увы.
Нашел способ конкретно инициализировать другую переменную и закинуть в неё i:
int j = i;
threads[i] = new Thread(x=>Func(j));
Тогда вывод становится ожидаемым 012.
Но ситуацию с непониманием как конкретно тред преобразует лямбду к нужным делегатам непонятно. А так же почему все они запускаются с тройкой Func(3), здесь что-то типо замыкания?