私はそのインターフェイスにWPFを使用するゲームを作成しており、Direct3D11は世界をレンダリングしています。レンダリングは独自のスレッドで行われますが、ウィンドウ内でD3DImageを使用する必要があるため、レンダリング時にUIスレッドに切り替えるにはSynchronizationContextを使用する必要があります。ゲームが最初に起動すると、私はApplication.Current.DispatcherからDispatcherSynchronizationContextを作成します。その後、ウィンドウが作成され、Application.Current.MainWindowに格納されます。レンダリングに時間がかかる場合は、次のようなコンテキストに切り替える必要があります。メインウィンドウが閉じたときにSynchronizationContextはどうなりますか?
メインウィンドウが閉じるまではすべて正常です。一旦それが起こると、すべてのサブシステムにシャットダウンを指示してから応答を待つApplication.Exitのハンドラが実行されます。問題は、レンダスレッドが次のAsync.SwitchToContextでハングするか、またはウィンドウが閉じられる直前にスイッチが既に発生していた場合、実際のレンダリング中にハングすることがあるため、シャットダウン要求に応答できません。
DispatcherSynchronizationContextはnullにならず、DSCのHasShutdownStartedとHasShutdownFinishedの値は両方ともfalseです。私は例外もありません。アプリケーションはまだ実行されており、すべてのサブシステムから応答が得られるまで終了しません。
プログラムのこの時点で何が起こっていますか?アプリケーションはまだ実行されているので、そのディスパッチャはまだそこにあるはずなので、私はまだそのコンテキストに切り替えることができます。ウィンドウが閉じる前と後にSynchronizationContextに変更はありません。これは、もはや有効ではないと信じるようになります。したがって、スイッチするかどうかを確認する方法はわかりません。 Application.Current.ShutdownMode
のあなたの価値のために
'Application.Current.ShutdownMode'の値は何ですか?それが 'ShutdownMode.OnMainWindowClose'なら、あなたが見ている動作が期待されます。 – ildjarn
OnLastWindowClose –
別のウィンドウが開いていますか?それを 'ShutdownMode.OnExplicitShutdown'に変更しようとしましたか? – ildjarn