2

のためにネストされた2つの他のスレッドを作成するメインスレッドがあります。

private void mainthread()
        {
            List<Thread> ts= new List<Thread>();

            for (int w=0; w<7; w+=2)
                for (int h = 0; h < 5; h+=3)
                {
                    Thread t = new Thread(delegate() { otherthreads(w, h); });
                    ts.Add(t);
                    t.Start();
                }
            for (int i = 0; i < ts.Count; i++)
                ts[i].Join();
        }

        private void otherthreads(int w, int h)
        {                    
            listBox1.Invoke(new singleparam(addtolistbox), new object[] { "w:" + w.ToString() + ",h:" + h.ToString() });        
        }

各スレッドは、入力引数をリストボックスに追加します。一部のスレッドの入力引数が範囲外にある理由がわかりません。

ここに画像の説明を入力してください

4

1 に答える 1

5

ループは正しく実行されていますが、何が起こっているのかというと、デリゲートは関数に渡さなければならないことを知っていますが、実際に呼び出されるまでこれらのw値はバインドされませんつまり、デリゲートが実際に実行される前に、とを使用する必要があることを認識しているだけです。最後の反復で、デリゲートに実行を要求していますが、実行する前に、開始スレッドで最後に増分して、値をそれぞれ8と6にします。ループが終了します。次に、picomomentsの後で、デリゲートが実行され、NOWの値はと...になりますが、値は8と6になります。hotherthreads()whwhwh

これを回避するには、デリゲートの周囲の最も狭いスコープにローカル変数を「スナップショット」wし、それらの値を適切に割り当てます。h

for (int h = 0; h < 5; h+=3) 
{
    int h2=h;
    int w2=w;

    Thread t = new Thread(delegate() { otherthreads(w2, h2); });
    ts.Add(t);
    t.Start();
}
于 2012-07-16T16:45:30.643 に答える