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フォームで時間遅延を行うのに問題がありました。

スレッド sleep 、 while(withDatetime) または同様の WinAPP 内に WebControl Browser があり、UI をフリーズせずに遅延時間のあるページをループに追加したいため、使用できませんでした。どちらのタイマーも私の状況では扱いにくいため、良い解決策ではありません。

したがって、ユーザーはこのソリューション(スレッドを使用するソリューション)を使用することを提案しています。私はそれが問題なく動作すると思っていましたが、ループに入れると(ループの)最後の要素だけを取り、すべて同じ要素で X スレッドを作成することに気付きました。

より良い説明のために:私はこれを持っていますList<Urls> url ;

このクラスで

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

単純な Foreach 内にそのコードを追加すると、スレッドがすべてループの最後の要素を使用し始める理由がわかりません。

List が正しいかどうかは既に確認しており、スレッドコードの前に現在のオブジェクトを表示する MessageBox を追加しており、適切に変更されています。

4

1 に答える 1

2

すべての匿名メソッドが同じlink変数を共有しています。

各メソッドが独自の変数を取得できるように、ループ内で別の変数を宣言する必要があります。

于 2011-11-23T20:45:00.387 に答える