public void GatherDataFromSwitches(Device[] switches)
{
List<Thread> workerThreads = new List<Thread>();
for(int i = 0; i < switches.Length - 1; i++)
{
Thread t = new Thread(unused => GatherDataFromSwitch(switches[i]));
workerThreads.Add(t);
t.Start();
}
foreach (Thread d in workerThreads) d.Join(); //wait for all threads to finish
}
そのメソッドを実行した後にスイッチをループすると、一部のスイッチにはデータが追加されておらず、一部のスイッチには複数のスイッチからデータが追加されていることがわかります。そのため、参照をワーカー スレッドに渡す際に問題が発生しました。正確にはまだわかりませんが、追加することで問題を解決しました
Thread.Sleep(100);
直後の
t.Start();
新しく作成されたスレッドは、次のスレッドが作成される前に初期化する時間があるため、これが機能すると想定しています。しかし、これは回避策であり、修正ではありません。ラムダ式がどのように機能するかが原因ですか?
これを適切に回避するにはどうすればよいですか?