0

WPF ウィンドウを作成して表示する UI スレッドがあります。サンプルコードは次のとおりです。

Thread thread = new Thread(() => 
    {
        Window window = new Window();
        window.Show();
        Dispatcher.Run();
    });
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

このコードでは、メイン プロセスがスレッドを作成し、そのスレッドから WPF ウィンドウが作成されます。スレッドの寿命は WPF Window と同じですか? WPF ウィンドウが閉じた場合、スレッドは終了しますか?

4

1 に答える 1

2

これをコンパイルして試してみると、ウィンドウを閉じてもスレッドが終了しないことがわかります。これは、メッセージ ループを処理するスレッドを開始するDispatcher.Run()と、停止するように指示するまで無限ループが続くためです。これは、新しい WPF アプリケーションが - への呼び出しで開始されるためですApplication.Run(MyMainWindow)。ただし、このスレッドでは、スレッドに属しwindow、スレッドにDispatcher属していますが、に属してDispatcherいないwindowため、ウィンドウを閉じてもディスパッチャーには何も影響しません。

Winforms では、スレッド内から呼び出して 2 番目の UI スレッドをハックできますがApplication.Run(MyForm)、私の知る限り、WPF ではこれを許可していません。セカンダリ スレッド内からアクセスすることはできず、スレッド内からApplication.Currentの新しいインスタンスを作成して実行することもできませんApplication。本当に、本当に、2 番目のメッセージ ループが必要な場合 (賢明な設計戦略ではおそらく正当化できないと思います)、クリーンアップ コードを記述して、スレッドの Dispatcher が確実にシャットダウンし、スレッドが終了するようにする必要があります。

于 2013-03-20T00:22:58.477 に答える