Давайте рассмотрим первый случай:
for (int i = 0; i < 10; i++)
{
bool flag = false;
new Thread(delegate() { DelegateDisplayIt(flag); }).Start();
flag = true;
}
Здесь, когда вы создаете анонимный делегат, значение флага равно false, но когда выполняется метод DelegateDisplayIt
, флаг уже установил значение true в следующей строке, и вы увидите вывод результатов. Вот еще один пример, который иллюстрирует ту же концепцию:
for (int i = 0; i < 5; i++)
{
ThreadPool.QueueUserWorkItem(state => Console.WriteLine(i));
}
Это напечатает пять раз пять.
Теперь давайте возьмем второй случай:
for (int i = 0; i < 10; i++)
{
bool flag = false;
var parameterizedThread = new Thread(ParameterizedDisplayIt);
parameterizedThread.Start(flag);
flag = true;
}
значение, передаваемое обратному вызову, является значением, которое переменная имеет при вызове метода Start
, то есть false
, и поэтому вы никогда не видите вывод в консоли.