Проблема с многопоточными параметрами при использовании делегата в компактной среде

Моя проблема в том, что у меня есть список строк, и я хочу создать один поток для одной строки, передать строку в поток. Это мой код:

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

См. Сообщение Эрика Липперта в блоге на эту тему для получения дополнительной информации.

Другие вопросы по тегам