我的问题是我有一个字符串列表,我想为一个字符串创建一个线程,将字符串传递给线程。这是我的代码:
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中的第一个元素。我该如何解决?提前谢谢。
答案 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。