Всем доброй ночи! Может кто сталкивался, у меня следующая проблема:
В цикле запускаю потоки которые разные по времени выполнении, потоку передаются параметры (кусок кода)
Thread t = new Thread(delegate() { Load(url[i], Convert.ToInt32(id[i])); });
t.Priority = ThreadPriority.Normal;
t.IsBackground = true;
t.Name = "Number " + i.ToString();
t.Start();
НО почему не могу понять итерация цикла не увеличивается и передается повторный параметр,
бывало даже что значение итерации превышает значение по условию, то есть выходит за рамки:
i — стает больше значения url.Count
for (int i = 0; ii3 < url.Count; i++)
В чем может быть проблема?
Заранее спасибо!
Здравствуйте, skiner.dp, Вы писали:
SD>В цикле запускаю потоки которые разные по времени выполнении, потоку передаются параметры (кусок кода)
У вас происходит захват переменной (closure). Грубо говоря, i снаружи делегата и внутри шарят одно значение.
лечится введением временной переменной, которая нигде больше не используется.
int j = i;
Thread t = new Thread(delegate() { Load(url[j], Convert.ToInt32(id[j])); });
// ...
Учтите, что массивы url и id также не должны изменяться до завершения использующих их потоков.
P.S. Надо бы добавить ссылки на примеры и описание замыканий, но увы,спешу. Anybody?
Здравствуйте, Sinix, Вы писали:
S>P.S. Надо бы добавить ссылки на примеры и описание замыканий, но увы,спешу. Anybody?
Спасибо за разъяснения, дальше информацию поищу сам, наводку дали! ))
Здравствуйте, samius, Вы писали:
S>Потому лучше ввести переменные для захвата var currentUrl = url[i] и var currentId = id[i]. Ведь делегату не нужны массивы и индекс, ему нужны именно значения.
Ага. Дядя сегодня тормоз