0

我对 C# 中的这段代码有疑问:

main class {
var trick = new Object();
}
.......
public void AddTabWithCheck(List<Urls> url)
{

//Some Code 

foreach(Urls link in url){
     var thread = new System.Threading.Thread(p =>
        {
            lock (trick)
            {
                Action action = () =>
                {
                    addTab(link);
                };
                this.Invoke(action);
                if(link.Host == "google")
                    System.Threading.Thread.Sleep(5000);
            }
        });
        thread.Start(); }
}

我在 winapp 表单中执行时间延迟时遇到问题。

我不能使用线程睡眠,while(withDatetime) 或类似的,因为在 WinAPP 中有一个 WebControl 浏览器,我希望在循环中添加一些页面,有一些延迟时间而不冻结 UI。这两个计时器都不是一个好的解决方案,因为我的情况很难处理。

因此,用户建议我使用此解决方案(带有线程的解决方案)。我认为它可以毫无问题地工作,但直到现在我才意识到,如果我放入我的循环中,它只需要最后一个元素(循环的)并创建所有具有相同元素的 X 线程。

为了更好的解释:我有这个List<Urls> url ;

与这堂课

public class Urls {
            public string Host { get; set; }
            public String url { get; set; }
}

现在我不明白为什么如果我在一个简单的 Foreach 中添加该代码,当线程启动时都使用循环的最后一个元素。

我已经检查了 List 是否正确,在线程代码之前添加了一个 MessageBox 以显示当前 Object ,并且它可以正确更改。

4

1 回答 1

2

您所有的匿名方法都共享同一个link变量。

您需要在循环内声明一个单独的变量,以便每个方法都有自己的变量。

于 2011-11-23T20:45:00.387 回答