2012-03-02 4 views
16

Control-CでC#コンソールアプリケーションを中断するとどうなりますか?Control-CでC#コンソールアプリケーションを中断するとどうなりますか?

プロセスが終了しましたか?メモリは解放されますか? finallyブロックが実行されていますか?データベース接続はどうなりますか?

アプリケーションがデバッグまたはリリース用にビルドされている場合、またはVisual Studioの内部/外部で実行されている場合は、これらの違いはありますか?

答えて

11

短い答え:それがCTRL-Cの後に何もしないことだ

ロング回答: はっきりそれが信号(割り込み)を送ることを、述べてMSDNにそれについての良い記事があります代わりに、キー入力の-events。

cancelKeyPress-Eventが登録されており、あなたが好きなものを登録して何でもできます!

不運にも、デフォルトで実際に何が行われたかについての情報はありません。たぶん最悪の場合は、あなた自身でそれをチェックすることができます。アロイス・クラウスが優雅にCTRL-Cを受け取った後、コンソール・アプリケーションをダウンshutingについてcodeproject-Articleを書いた:しかし、IMO ...

UPDATEそれについてのいくつかのドキュメントがあるはずです。

はアロイス・クラウスの言葉を引用するには:

CLRのデフォルトの動作は何もしないことです。これは、OSローダーロックがすでに使用されているため、CLRがDLL_PROCESS_DETACH通知によって非常に遅く通知され、コンテキストでマネージコードが実行されなくなることを意味します。残念ながら、通知イベントもファイナライザも実行されません。すべてのスレッドは、正常にシャットダウンするためにキャッチ/最終ブロックを実行する機会を与えずに静かに殺されます。最初の文章のデフォルトでは、この状況をうまく処理する方法があるので、私は言った。 Consoleクラスには、.NET 2.0の新しいイベントメンバーConsole.CancelKeyPressが追加されています。これにより、シャットダウンを停止できるCtrl-CおよびCtrl-Breakキーの通知を受け取ることができます(Ctrl-Cのみですが、Ctrl-Breakは使用できません)。ここでの主な問題は、Ctrl-C/Breakイベントをキャッチしてハンドラを終了するとファイナライザが呼び出されない場合です。これは私が協力的なシャットダウンと呼ぶものではありません。私の頭に浮かぶのは、Environment.Exitを呼び出すことですが、ファイナライザは起動しません。すべてが失われません。私はすべてのファイナライザを実行するための汚いトリックを思いついた:私たちは、Environment.Exitを呼び出すイベントハンドラの中に少しヘルパースレッドをスピンアップします。 Voila、ファイナライザが呼び出されます。

関連する問題