私は小さなSSHClientに取り組んでいます。さまざまなコンピューターに接続されているクライアントのリストがあります。それらのコンピューターで実行したいスクリプトがあります。異なるスレッドで並行して実行したいと思います。私はここでインスピレーションを得ました: Stackoverflow-スレッド
これが私のコードです:
int toProcess, count = 0;
ManualResetEvent resetEvent = new ManualResetEvent(false);
toProcess = count = clients.Count;
for (int i = 0; i < count; i++)
{
new Thread(delegate()
{
var cmd = clients[i].RunCommand("./script.sh");
res += cmd.Result;
if (Interlocked.Decrement(ref toProcess) == 0)
resetEvent.Set();
}).Start();
}
resetEvent.WaitOne();
//do something
私には、このコードは問題ないように見えます。しかし、場合によっては(実際にはほとんどの場合)、プログラムがforループから正しく外れたresetEvent.WaitOne();
後、正しく行に到達しますが、その後、すべてのスレッドが終了して残りのコードを続行するのを待つのではなく、再び新しいThread(delegate()...コードの一部に移動し、変数iがすでに2であるため(クライアントのリストに2つのクライアントがある場合)、エラーが発生します。
インデックスが範囲外でした。負ではなく、コレクションのサイズよりも小さい必要があります。
forループが終了しても、別のスレッドが作成される可能性があるのかどうかを尋ねたいと思いました。そしてそれを回避する方法は?
ありがとうございました