今日、Windows フォーム アプリケーションにマルチ スレッドを追加しました。私のUIスレッドでは、 new Thread() {...}).Start(); を介してスレッドを開始しています。それ自体が ThreadPool.QueueUserWorkItem() を使用するメソッドを呼び出します。メソッドが呼び出された後、特定のアイテムが返されてスレッドが終了するまで、スレッドはキューで待機します。
new Thread(o =>
{
s.SimulateChanges();
Boolean run = true;
while (run)
{
SimulationResult sr = queue.WaitDequeue();
//EOF is a static property which will be returned
//if the queue is at its end so I can break the while loop
if (SimulationResult.EOF.Equals(sr))
{
run = false;
continue;
}
this.simulationProgressBar.BeginInvoke((Action)delegate()
{
if (sr.IsDummy && this.simulationProgressBar.Value < this.simulationProgressBar.Maximum)
{
/*...*/
}
else
{
this.resultListView.AddObject(sr);
}
});
}
this.simulationProgressBar.BeginInvoke((Action)delegate()
{
this.ToggleSimulationControls(true);
});
}).Start();
そして、それは呼び出されたメソッドのコードです:
public void SimulateChanges()
{
ThreadPool.QueueUserWorkItem(o =>
{
foreach (IColElem elem in collection.AsEnumerable())
{
/*lot of code*/
queue.Enqueue(new SimulationResult() { IsDummy = true });
}
log.Debug("Finished!");
queue.Enqueue(SimulationResult.EOF);
});
}
My Queue は、オブジェクトがエンキューされるまでスレッドがデキューを待機できるようにする自己記述クラスです。
VS2010 がファイル ハンドルを削除しないため、デバッグを停止した場合 (停止デバッグを使用するか、単にアプリケーションを閉じる) を除いて、すべて正常に動作しています。スレッドが正しく終了しないことに関係があると思います。これを保証できる方法はありますか?
アドバイスをありがとう:-)