2009-05-21 9 views
0

私は、アプリケーションと外部サービスとの間の接続を管理するサーバーアプリケーション内にコンポーネントを構築しています。私のコンポーネントは、サーバーが利用できなくなったことを検出し、サービスが利用可能になるまでバックグラウンドスレッドを開始し、「稼働中」の状態に再び入ります。アプリケーションのクローズを検出するにはどうすればよいですか?

私の問題は、このスレッドの実行中にコンポーネントを呼び出すプロセスが終了すると、アプリケーションはスレッドが終了するまで終了しないということです。基本的に、このサービスが利用可能な場合、私のアプリケーションはシャットダウンできません。

私の質問:アプリケーションが終了しようとすると、バックグラウンドスレッドが終了できるかどうかを検出する方法はありますか?私はAppDomainクラスのいくつかのイベントに気づいたことがありますが、どの条件とどの環境でそれらが解雇されるかはわかりません。

これは低レベルのコンポーネントなので、実行している環境について何も知りたくはありません。高レベルのコンポーネントがシャットダウンしていることを伝える必要はありません。

このコンポーネントは、WCFサービスとWindowsサービスアプリケーションの両方で使用されます。また、WinFormクライアントアプリケーションからテストを行っています。

答えて

0

"これは低レベルのコンポーネントなので、実行している環境について何も知りたくないので、上位のコンポーネントがシャットダウンしていることを伝える必要はありません。

この2つの要件は矛盾しています。コンポーネントがアプリケーションのシャットダウン時(アプリケーションが実行されている環境について知っている必要がある場合)、または何らかの上位コンポーネント(環境について知っていること)がそれを知らせる必要があるかどうかを、閉鎖すること。他の選択肢はありません。

私の意見では、コンポーネントは、どのように使用されるかについてできるだけ少ない仮定を置くべきです。たとえば、アプリケーションのライフサイクル全体にわたって使用されることは想定してはいけませんが、アプリケーションのニーズに応じていつでも開始および停止できます。コンポーネントが使用されている唯一の方法はアプリケーションの存続期間であることが判明したとしても、そのようなアプローチはよりクリーンな設計につながります。したがって、正しい方法は、コンポーネントが不要になったときにコンポーネントに通知することです。アプリケーションがシャットダウンしているかどうかに関係なく、コンポーネント自体を終了する必要があります。私はそれがコンポーネントを設計するときの典型的なアプローチだとも言います。

1

下位レベルのものを処理する必要がある場合は、アプリケーションの終了イベントである を監視するコンポーネントが必要な可能性があります。 このコードは、終了プロセスを監視するために使用されます。 (誰かがタスクマネージャから終了タスクを実行した場合にも機能します)。

Process MyMonitoredProcess = null; 
private void Form1_Load(object sender, EventArgs e) 
{ 
    Process[] p = Process.GetProcessesByName("processName", "machineName"); 
    if (p.Length > 0) 
    { 
     MyMonitoredProcess = p[0]; 
     MyMonitoredProcess.EnableRaisingEvents = true; 
     MyMonitoredProcess.Exited += TestProcessEndedEvent; 
    } 

} 

private void TestProcessEndedEvent(object sender, System.EventArgs e) 
{ 
    // Tasks to be done if application closes. 
} 

これは役に立ちます。

関連する問題