0

私はc#とマルチスレッドに少し慣れていないので、ここでばかげた間違いをしているかもしれませんが、これを理解できないようです。ネットワーク上で検出されたマシンの数に基づいてスレッドの配列を作成するアプリケーションがあり、マシンごとに、作成した関数を実行するスレッドを作成します。forループを終了した後、別の関数を実行する別のスレッドを作成します。私の関数は完全に正常に動作し、問題はありません。問題は、forループを終了して次のスレッドの作成に進んだ後、何らかの理由でアプリケーションがforループに戻り、インデックスが範囲外になり、スローされる例外。これを明確に説明しているといいのですが、forループが終了すると、コード行が実行されて元に戻る理由がわからないため、なぜこれが発生するのか困惑しています。

        smThread = new Thread[networkedComputers.Count];

        for (UInt16 i = 0; i < networkedComputers.Count; i++)
        {
            smThread[i] = new Thread(delegate() { sm.RunServerMonitorPerMachine(networkedComputers[i].ToString()); });
            smThread[i].Start();
        }

        dailyThread = new Thread(dailyEvents);
        dailyThread.Start();
4

2 に答える 2

6

あなたの問題はここにあると思います:

networkedComputers[i].ToString()
                   ^

これを行うときにの値をスレッドに渡すことを期待するかもしれませんiが、実際には への参照を渡しますi。この参照はループすると更新されるため、スレッドが実際に実行されると、期待する値にならない可能性が高くなります。(Google キーワード: キャプチャされた変数)

解決策は、値をスレッドに渡す前にコピーを作成することです。このコピーは更新されません。

for (int i = 0; i < networkedComputers.Count; i++)
{
    int tmp = i;
    smThread[i] = new Thread(delegate() { sm.RunServerMonitorPerMachine(networkedComputers[tmp].ToString()); });
    smThread[i].Start();
}
于 2012-12-20T13:50:26.960 に答える