Проблема с многопоточными параметрами при использовании делегата в компактной среде
Моя проблема в том, что у меня есть список строк, и я хочу создать один поток для одной строки, передать строку в поток. Это мой код:
public void getImageSource(List<string> UrlLinks)
foreach (string urlLink in UrlLinks)
{
ThreadStart myThread = delegate { Fetch(urlLink); };
Thread t = new Thread(myThread);
t.Priority = ThreadPriority.Lowest;
t.IsBackground = true;
t.Start();
}
public void Fetch(string Link)
{
MessageBox.Show(Link);
}
Но все мои сообщения возвращают одинаковые результаты, первый элемент в списке. Как я могу это исправить? Заранее спасибо.
1 ответ
Решение
Вы столкнулись с проблемой перехваченной переменной... вы захватываете urlLink
переменная, а не значение во время создания делегата. Исправление для этого заключается в создании временной переменной внутри цикла:
public void getImageSource(List<string> UrlLinks)
{
foreach (string urlLink in UrlLinks)
{
string urlCopy = urlLink;
ThreadStart myThread = delegate { Fetch(urlCopy); };
Thread t = new Thread(myThread);
t.Priority = ThreadPriority.Lowest;
t.IsBackground = true;
t.Start();
}
}
Я не ожидал, что первый URL будет загружен несколько раз - более вероятно, что будет получен последний URL (или какое-то множество URL).
См. Сообщение Эрика Липперта в блоге на эту тему для получения дополнительной информации.