紧致框架中使用委托的多线程参数问题

时间:2010-01-14 10:00:33

标签: .net multithreading compact-framework

我的问题是我有一个字符串列表,我想为一个字符串创建一个线程,将字符串传递给线程。这是我的代码:

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);
    }

但我的所有消息框都返回相同的结果,即List中的第一个元素。我该如何解决?提前谢谢。

1 个答案:

答案 0 :(得分: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();
    }
}

我不希望多次获取第一个网址 - 更有可能提取 last 网址(或者某些种类的网址) )。

有关详情,请参阅此主题的Eric Lippert's blog post