Аналогичный вопрос был задан здесь , но ответы, как правило, все относятся к лямбда-нотации.Я получаю аналогичный результат без лямбды, поэтому я подумал, что попросил бы уточнить:
Скажем, у меня что-то вроде этого:
for (int i = 0; i < 5; i++)
(new Thread(new ThreadStart(delegate()
{
Console.WriteLine("Thread " + i);
}))).Start();
Можно ожидать следующий вывод:
Thread 0
Thread 1
Thread 2
Thread 3
Thread 4
Теперь я понимаю, что потоки запускаются не в каком-то конкретном порядке, поэтому давайте просто предположим, что приведенные выше строки могут появляться в любом порядке.
Но это не то, что происходит.Вместо этого происходит следующее:
Thread 3
Thread 4
Thread 4
Thread 4
Thread 4
или что-то подобное, что заставляет меня поверить, что вместо передачи значения, если i, передается ссылка.(Что странно, поскольку int является типом значения).
Делать что-то вроде этого:
for (int i = 0; i < 5; i++)
(new Thread(new ThreadStart(delegate()
{
int j = i;
Console.WriteLine("Thread " + j);
}))).Start();
тоже не помогает, хотя мы сделали копию i.Я предполагаю, что причина в том, что он не сделал копию i вовремя.
Делая что-то вроде этого:
for (int i = 0; i < 5; i++)
{
(new Thread(new ThreadStart(delegate()
{
Console.WriteLine("Thread " + i);
}))).Start();
Thread.Sleep(50);
}
, кажется, решает проблему, однако это крайне нежелательнотак как мы тратим 50 мс на каждую итерацию, не говоря уже о том, что если компьютер сильно загружен, то, возможно, 50 мс может быть недостаточно.
Вот пример моей текущей конкретной проблемы:
Thread t = new Thread(new ThreadStart(delgate()
{
threadLogic(param1, param2, param3, param4);
}));
t.Start();
param1 = param2 = param3 = param4 = null;
с:
void threadLogic(object param1, object param2, object param3, object param4)
{
// Do some stuff here...
}
Я хочу, чтобы threadLogic () выполнялся в своем собственном потоке, однако приведенный выше код дает исключение нулевой ссылки.Я предполагаю, что это потому, что значения установлены в ноль, прежде чем поток сможет начать.
Опять же, установка Thread.Sleep (100) работает, но это ужасное решение с любой стороны.Что вы, ребята, рекомендуете для этого конкретного типа гонки?