Я поиграл с Threads и Tasks (.net 4) и заметил странное поведение при запуске нескольких потоков без ожидания нескольких миллисекунд между каждым вызовом потока.
В приведенном ниже примере при запуске не выводится то, что я ожидал:
1
2
1
2
Но вместо этого выводятся только:
2
2
2
2
Ниже приведен код, который я запускаю.
public static void Main()
{
var items = new[] {"1", "2"};
foreach (var item in items)
{
var thread = new Thread(() => Print(item));
thread.Start();
//var task = Task.Factory.StartNew(() => Print(item));
}
}
static void Print(string something)
{
while (true)
{
Console.WriteLine(something);
Thread.Sleep(1000);
}
}
Теперь, когда я вызываю Thread.Sleep (50) после thread.Start (), тогда только результат будет выглядеть как положено
1
2
1
2
Мой вопрос:
- Почему, когда вы не ждете между запуском обоих потоков, первый поток теряет значение параметра метода, с которого вы его изначально запустили?
т.е. первый поток запускается с параметром "1", второй поток запускается с параметром "2", однако параметр первого потока также становится "2"?Это не имеет смысла, тем более что параметр метода Print () является типом значения строки.