Проблема в том, что у вас есть только одна переменная ID
, и она записывается. Переменная имеет значение read только когда код в новом потоке фактически выполняется, что часто происходит после того, как ваш основной поток завершил свой цикл, оставляя ID
в maxValue
. Сделайте копию на каждой итерации цикла, чтобы каждый раз захватывать разные переменные:
for (int ID = 0; ID < maxValue; ID++)
{
int copy = ID;
threads.Add(new Thread(() => temp(myString, copy)));
threads[rowID].Start();
}
Это распространенная ошибка с замыканиями. Прочитайте мою статью, сравнивающую закрытия C # и Java для получения дополнительной информации. Кстати, то же самое происходит с foreach
- и это еще более запутанно, поскольку читает , как будто вы каждый раз получаете новую переменную:
foreach (string url in urls)
{
// Aargh, bug! Don't do this!
new Thread(() => Fetch(url)).Start();
}
Опять же, вы получите только одну переменную. Вам нужно, чтобы каждый делегат захватывал отдельную переменную, поэтому вы снова используете копию:
foreach (string url in urls)
{
string urlCopy = url;
new Thread(() => Fetch(urlCopy)).Start();
}