Цикл + поток с параметром
От: skiner.dp  
Дата: 24.06.10 23:59
Оценка:
Всем доброй ночи! Может кто сталкивался, у меня следующая проблема:
В цикле запускаю потоки которые разные по времени выполнении, потоку передаются параметры (кусок кода)

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++)




В чем может быть проблема?
Заранее спасибо!
c# .net 4
Re: Цикл + поток с параметром
От: Sinix  
Дата: 25.06.10 00:21
Оценка:
Здравствуйте, 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?
Re[2]: Цикл + поток с параметром
От: skiner.dp  
Дата: 25.06.10 00:29
Оценка:
Здравствуйте, Sinix, Вы писали:


S>P.S. Надо бы добавить ссылки на примеры и описание замыканий, но увы,спешу. Anybody?


Спасибо за разъяснения, дальше информацию поищу сам, наводку дали! ))
Re[3]: Цикл + поток с параметром
От: Sinix  
Дата: 25.06.10 01:36
Оценка:
Здравствуйте, skiner.dp, Вы писали:

Например
http://www.rsdn.ru/article/csharp/anonymousmethods.xml#EGBAE
Автор(ы): Patrick Smacchia
Дата: 30.07.2006
Статья представляет новое свойство языка C# версии 2.0, называемое анонимными методами.

http://www.rsdn.ru/article/dotnet/cslambda.xml#ETMAC
Автор(ы): Трей Нэш
Дата: 09.02.2008
Глава из книги “C# 2008: ускоренный курс для профессионалов”
Re[2]: Цикл + поток с параметром
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.06.10 03:58
Оценка: 12 (1) +1
Здравствуйте, Sinix, Вы писали:

S>Учтите, что массивы url и id также не должны изменяться до завершения использующих их потоков.


Потому лучше ввести переменные для захвата var currentUrl = url[i] и var currentId = id[i]. Ведь делегату не нужны массивы и индекс, ему нужны именно значения.
Re[3]: Цикл + поток с параметром
От: Sinix  
Дата: 25.06.10 06:13
Оценка:
Здравствуйте, samius, Вы писали:

S>Потому лучше ввести переменные для захвата var currentUrl = url[i] и var currentId = id[i]. Ведь делегату не нужны массивы и индекс, ему нужны именно значения.

Ага. Дядя сегодня тормоз
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.