我正在處理小SSHClient。我有一個連接到不同計算機的客戶端列表。我有一個腳本,我想在這些計算機上運行。我想在不同的線程中並行運行它。 我來到這裏的啓發: Stackoverflow - threadsC#多線程的工作,然後等到所有完成
這裏是我的一段代碼:
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
對我來說,這個代碼看起來OK。但有時(實際上在大多數情況下),它發生在程序正確退出for循環後,它會正確地到達resetEvent.WaitOne();
行,但之後,而不是等待所有線程完成並繼續執行其餘代碼,再次進入新的Thread(委託()...代碼的一部分,因爲變量i已經是2(如果有在客戶端列表中兩個客戶端)我得到一個錯誤:
Index was out of range. Must be non-negative and less than the size of the collection.
我想問問它是如何可能的,它創建另一個線程雖然for循環結束了。而如何避免?
謝謝
似乎這個問題是靠近clients.Count。發佈更多相關的代碼 – Regfor
爲什麼你不使用Thread.Join? – Vlad
那麼,你確定你的代碼不是外部循環的一部分或不再被調用嗎?你也許應該在函數的開始處使用斷點。 – Vlad