GUI の更新に時間がかかるアプリケーションがあります。これをバックグラウンド スレッドで実行することはできません。これは、メイン スレッドでのみ実行できる GUI コンポーネントの更新に長い処理が関連付けられているためです。
したがって、GUI の更新が完了するまでバックグラウンド スレッドで WaitDialog フォームを作成して表示するヘルパー クラスを作成しました。
私のヘルパークラスは次のようになります。
public class ProgressWaitDialogHelper : IDisposable
{
private Thread _thread = null;
public void ShowDialog()
{
ThreadStart threadStart = new ThreadStart(ShowDialogAsync);
_thread = new Thread(threadStart);
_thread.SetApartmentState(ApartmentState.STA);
_thread.Start();
}
public void Dispose()
{
if ((_thread != null) &&
(_thread.IsAlive))
{
_thread.Abort();
}
}
private void ShowDialogAsync()
{
ProgressWaitDialog waitDialog = new ProgressWaitDialog();
waitDialog.ShowDialog();
}
}
メイン GUI ウィンドウでヘルパー クラスを呼び出すコードは次のようになります。
using (ProgressWaitDialogHelper waitDialog = new ProgressWaitDialogHelper())
{
waitDialog.ShowDialog();
// Do long running GUI task on main thread here.
}
これはうまく動作しているようで、GUI で私が望むのとまったく同じように見えます。WaitDialog フォームはモーダルであり、更新が完了するまでメイン GUI フォームへのアクセスをブロックします。長時間実行されている GUI タスクが完了するとすぐに、Using ブロックから脱落し、ヘルパー クラスで Dispose メソッドが呼び出され、スレッドで Abort が呼び出されます。
私の質問は、スレッドを終了するためのより適切な方法、または同じ動作を達成するためのより良い方法はありますか?