2016-05-25 10 views
0

シンプルなwpfアプリケーションを使用して、明示的にシャットダウンしてから実行しても引き続き実行します。明示的なシャットダウン後もWPFアプリケーションが続行します

サードパーティのアプリケーションと統合されており、特定の種類の特定のコンテンツをいくつかのドキュメントが初期化されたときに開いていることを確認する必要があります。ここで

は、初期化コードの一部です:

try 
{ 
    ActiveProductDoc = Automation.CATIA.ActiveDocument as ProductDocument; 
} 
catch 
{ 
    InvalidAssemblyShutdown("You must have an assembly open before you run the app"); 
} 

if(ActiveProduct == null) 
    InvalidAssemblyShutdown("You must have one assembly open (not a part)"); 

ActiveProduct = ActiveProductDoc.Product; 

そして、ここではInvalidAssemblyShutdown方法である:

private void InvalidAssemblyShutdown(string message) 
{ 
    MessageBox.Show(message); 
    Close(); 
    Application.Current.Shutdown(); 
} 

私はOnMainWindowCloseに、アプリケーションのShutdownModeプロパティを設定しました。

私は現在、ユーザーが間違った種類のドキュメントを開いているため、ActiveProductフィールドがnullであるユースケーステストを行っています。 InvalidAssemblyShutdownメソッドは期待通りに呼び出されますが、これにもかかわらず、シャットダウンコールに続く初期化メソッドの行は実行され、例外がスローされます。

何が起こっているのですか?

代わりに例外をスローし、グローバル例外ハンドラを使用する必要がありますか?

答えて

2

Application.Current.Shutdownlink to source)のソースコードを見ると、Dispatcher.BeginInvoke()を使用してシャットダウンが開始されていることがわかります。言い換えれば、シャットダウンは、UIスレッド上にのキューに入れられます。その正確なメソッド呼び出しの間は有効にならないので、次のコードは実行を継続します。

シャットダウン要求の処理中にコードを実行したくない場合は、Application.Current.Shutdownを呼び出した直後にコードを終了する必要があります。同様に、それは価値があるものを、this.Close()作品については

if(ActiveProduct == null) 
{ 
    InvalidAssemblyShutdown("You must have one assembly open (not a part)"); 
    return; // prevent further code execution. 
} 

:ような何か。したがって、適切なフロー制御がある場合は、Application.Current.Shutdownをまったく呼び出す必要はありません。 this.Close()への電話で十分です。

+0

その答えは簡単すぎる – Eric

+1

あなたが望むなら、はるかに複雑なものを思いつくことができると確信しています。 –

関連する問題