Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net compact框架中使用委托的多线程参数问题_.net_Multithreading_Compact Framework - Fatal编程技术网

.net compact框架中使用委托的多线程参数问题

.net compact框架中使用委托的多线程参数问题,.net,multithreading,compact-framework,.net,Multithreading,Compact Framework,我的问题是我有一个字符串列表,我想为一个字符串创建一个线程,将字符串传递到线程中。这是我的代码: public void getImageSource(List<string> UrlLinks) foreach (string urlLink in UrlLinks) { ThreadStart myThread = delegate { Fetch(urlLink); };

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

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);
    }
public void getImageSource(列出URL链接)
foreach(URL链接中的字符串URL链接)
{
ThreadStart myThread=委托{Fetch(urlink);};
螺纹t=新螺纹(myThread);
t、 优先级=线程优先级。最低;
t、 IsBackground=true;
t、 Start();
}
公共无效获取(字符串链接)
{
MessageBox.Show(Link);
}

但是所有我的messagebox都返回相同的结果,这是列表中的第一个元素。我怎样才能修好它?提前感谢。

您遇到了捕获的变量问题。。。您捕获的是
urlink
变量,而不是创建委托时的值。解决方法是在循环内创建一个临时变量:

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();
    }
}
public void getImageSource(列出URL链接)
{
foreach(URL链接中的字符串URL链接)
{
字符串urlCopy=urlink;
ThreadStart myThread=委托{Fetch(urlCopy);};
螺纹t=新螺纹(myThread);
t、 优先级=线程优先级。最低;
t、 IsBackground=true;
t、 Start();
}
}
不过,我不希望第一个URL被多次抓取——更可能的情况是最后一个URL被抓取(或者多种URL)


有关更多信息,请参阅本主题。

感谢您的快速回复。我对学员仍有点困惑,正在阅读您的文档。祝您今天过得愉快。附言:你能解释一下吗:“虽然我不希望第一个URL被多次获取,但更可能的是最后一个URL会被获取(或者多种URL)”。@Thyphuong:
Fetch
将在实际调用委托时使用变量的任何值来调用。这很可能是在创建所有线程之后,即循环完成时——在这种情况下,该值将是最后遇到的值。但这是非常不确定的;例如,在“0,1,2,3,4”的列表中,你可以得到“0,1,3,4,4”。@Jon:你说得太对了。我重新检查了代码,发现返回的所有结果都是列表中的最后一个元素。再次感谢您提供的信息