3

Stack Overflowのこのトピックには、すでにかなり良いスレッドがいくつかありますが、それらのいずれにも簡潔な答えは実際にはないようです。私のC#コンソールアプリケーション(Windowsサービスとして実行)はJavaプロセスを起動して管理(開始/停止/再起動)しますが、私の問題は、マシンにリモートでアクセスし、約20のJavaプロセスが開始されることを確認することです。

これは明らかに、ある時点でアプリケーションがクラッシュし、開始したJavaプロセスをシャットダウンしないという問題です。AppDomain.CurrentDomainに「UnhandledExceptionEventHandler」をフックし、そこからTerminateProcess()を呼び出します(アクティブなJavaプロセスをシャットダウンします)が、この問題は引き続き発生します。

私のアプリケーションには、メインスレッド、TCPサーバースレッド(非同期接続を受け入れる)、およびUDPサーバースレッドがあります。UnhandledExceptionの上にフックする必要があるものは他にありますか?

編集

また、コードにいくつかのTry / Catchブロックがあり、コンソールに書き込むだけで、これは表示されません。これらを削除してUnhandledExceptionによってキャッチされるようにするか、代わりにロガーを追加する必要がありますか?

4

2 に答える 2

1

まず、ログを記録したくない場合は、Console.WriteLine..コードの行をに変更する必要があるため、出力はデバッグ時にのみ行われます。Debug.WriteLine..

次に、例外の処理方法や修正方法がわからない場合に例外が発生した場合はcatch { throw; }、ログに記録した後に再スローします。私は個人的にします

try
{
    ...
}
catch (Exception exception)
{
    Log(exceptiosn);//log it first or Debug.WriteLine...
#if DEBUG
    System.Diagnostics.Debugger.Break();//break at the debugger here.
#endif//DEBUG
    throw;
} 

コードをクリーンアップした後、DomainUnhandledExceptionスローされたときにいつでもアプリケーションを再起動できます。例はここにあります。アイデアは、アプリケーションから新しいインスタンスを開始してから、最初のインスタンスを終了することです。また、ミューテックスを定義して、一度に1つのインスタンスのみが有効になるようにします。

于 2011-07-31T08:10:15.613 に答える
0

考慮すべき点は、.NETアプリケーションが生成されたプロセスを担当するようにするかどうかです。可能であれば、入力を受け取らなくなったときにシャットダウンする責任を負わせることができます。生成されたプロセスが他のマシンで実行されている場合は、ネットワークの問題が.NETアプリケーションからJavaプロセスへのシャットダウンメッセージの送信を妨げる可能性があるため、とにかくそれを実行しようとします。それぞれ独自の責任。

とはいえ、.NETアプリケーションでの例外処理を修正することも重要です(特にいくつかの例外が欠落している場合)。各スレッドにその例外の責任を負わせ、デバッグを容易にするためにそれらをログに記録するようにしてください。

于 2011-07-31T08:05:24.233 に答える