1

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 が呼び出されます。

私の質問は、スレッドを終了するためのより適切な方法、または同じ動作を達成するためのより良い方法はありますか?

4

1 に答える 1

2

ワーカー スレッドで実際の作業を行い、GUI スレッドで waitdialog を表示することをお勧めします。次に、作業が完了したときにメインスレッドにシグナルを送ることができます。作業が完了すると、スレッドは通常の方法で正常に終了し、他のダイアログを強制終了するのと同じように、waitdialog を強制終了できます。

于 2011-05-10T15:09:13.640 に答える