2011-12-17 7 views
0

私はそのインターフェイスに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のあなたの価値のために

+0

'Application.Current.ShutdownMode'の値は何ですか?それが 'ShutdownMode.OnMainWindowClose'なら、あなたが見ている動作が期待されます。 – ildjarn

+0

OnLastWindowClose –

+0

別のウィンドウが開いていますか?それを 'ShutdownMode.OnExplicitShutdown'に変更しようとしましたか? – ildjarn

答えて

2
(コメントから再投稿)

、あなたが見ている動作が期待されている - あなたのメインウィンドウが閉じているとき、あなたは、あなたのメインウィンドウよりも開いて、他の他のウィンドウを持っていないので、 (文書を引用)

Windows Presentation Foundation(WPF)は、アプリケーション内の最後のウィンドウが閉じると暗黙のうちにShutdownを呼び出します。

もちろん、Shutdownを(直接的または間接的に)呼び出すと、プロセスが明示的に終了されます。いくつかのアプリケーションの寿命は時にメインウィンドウまたは最後に依存しないかもしれません

はあなたがShutdownMode.OnExplicitShutdownApplication.Current.ShutdownModeに値を割り当てる必要があり、すべてのウィンドウが閉じられた後も、あなたのプロセスが生きたままにしたい場合ウィンドウが閉じているか、ウィンドウに依存していない可能性があります。これらのシナリオでは、ShutdownModeプロパティをOnExplicitShutdownに設定する必要があります。これは、アプリケーションを停止するための明示的なShutdownメソッド呼び出しが必要です。それ以外の場合、アプリケーションはバックグラウンドで実行され続けます。

あなたの正確なシナリオのようなものです。 ; - ]

+0

右ですが、「アプリケーションが実行を停止しようとしていることを検出して、適切な処理を実行するためにExitイベントを処理できます。 Exitにハンドラを追加しました。レンダラにそのハンドラをシャットダウンするように指示していました。 「走りを止めようとしている」と言って以来、私はそれがうまくいくと思いました。私を修正してくれてありがとう。 –

+0

実際、SessionEndingは、ユーザーがログオフ/シャットダウンしているときにのみ機能するように見えます。アプリケーションが終了するときに私のための効果はありません。 –

+0

@PatrickLafferty:あなたは間違いなく正解です。 – ildjarn

関連する問題