2016-08-16 12 views
2

は、私は通常私のアプリケーションを終了するために、KeyDownサブに次の行を追加しましたリソースを解放するという点でアプリケーションを終了する最悪の方法の1つです。アプリケーションを正しく終了するにはどうすればいいですか?実際にはありません<code>End</code>は、それはそれはおそらくであることが判明したものにドキュメントを読めば、</p> <pre><code>If e.KeyCode = Keys.Escape Then End </code></pre> <p>しかし:過去に

これで、すべてのリソースなどを適切に処理するアプリケーションを終了するための推奨方法を見つけようとしています。 SOの2つの質問(herehere)しかし私は結論できません実際の正解は何ですか?

first linkの回答では、すべてのフォームにClose()を適用すると正しい方法であり、正しく使用されているすべてのリソースが解放されます。これは、複数のフォームを持つアプリケーションでは便利ではない、とApplication.Exit()が示唆されたダウンさらに、さらには:間違いなくなります

Application.Exit() 
End 

は必ずプログラムは、最初の行が失敗しても終了します。一方

は、 second linkの受け入れ答えは、上記とあらゆる形態の Application.Exit()通話 Close()を言うさらに下に答えを矛盾、「 は、あなたが適切に設計されたアプリケーションApplication.Exit()を呼び出す必要がありません」と言います.Netの後のバージョンでは。

これは私に混乱をもたらしました - Application.Exit()で何が問題になっていますか?

それに問題がなければ、私は右に行くには最高の1がある思考で午前:

Application.Exit() 
End 

またはそれをやり過ぎということでしょうか?それ以外の場合は、いつApplication.Exit()が機能しなくなるのですか?

注:複数の書式を含むすべてのプログラムにこの質問が当てはまりますが、私は最近コンピュータ同士を接続するためにソケット(TcpClient/Listenerクラス)を使用し始めました。接続途中のプログラム。私のrecent questionのコメントは、Socket.Close()という呼出しが必要ではないことを私に保証します、しかし、今私はEndを使用していたので、これが完全に真実ではないかもしれません。

+3

'が、私はあなたがEnd'の実行が直ちに終了されます'呼び出す-if before'を終了するために、エンドを使用していたので、今、私は、これは完全に真実ではないかもしれないことを認識し、優雅なガベージコレクションはありません(すべてがOSによってリリースされる)。したがって、 'End'を使用して接続を正常に閉じるには、' Socket.Close() 'を呼び出す必要があります。 **しかし**もし 'End'を使うと、ソケットの処分が完了する前に実行を終了する可能性があります。アプリケーションリリースに 'End'を使用することは推奨されません。 –

+0

@VisualVincentありがとう、私は '終わり'を避けるだろうと思う。 btwなぜ質問は編集?これは.NETにのみ適用されますか? – Shuri2060

+1

タイトルから「VB」を削除しました。不要で、あなたの言語やタグをそこに書き込むことを推奨していません。 'vb.net'で質問にタグを付けると、既に使用している言語が示されているので十分です。参照:[**質問にはタイトルにタグを含める必要がありますか?**](http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles) –

答えて

2

Application.Exitは、そのアプリケーションのすべてのメッセージループに終了メッセージを投稿します。

これは、アプリケーションを完全に許容する方法であり、すべてのフォームをシャットダウンしようとします。たとえば、保存されていない作業がある場合など、個々のフォームでこの動作を無効にすることができます。これにより、後でアプリケーションが実行されるため、処理が必要かどうかを判断する必要があります。

私は、外部のアクタがアプリケーションをシャットダウンする必要がある場合にのみ使用すると言っています。それ以外の場合は、メインフォームが閉じたときにアプリケーションを終了します。

フォアグラウンドスレッドの状態も考慮する必要があります。フォアグラウンドスレッドはすべてのフォームを閉じることができますが、バックグラウンドでスレッドを処理したままにすることができます。

Endは非常に強力な手法であり、最後のresotとして使用する必要があります。うまく設計されたアプリケーションは、フォームを閉じたり、application.exitを呼び出してシャットダウンすることができます。私はApplication.Exitを呼び出す直前にEndを呼び出すタイマーを起動するというアプローチを過去に使用しました...少なくとも、私はそれを正常に完了するチャンスを与えます。

注::Application.Exitはブロックされません。したがって、Application.Exit : Endは、理想的ではないEndである可能性があります。

は、ここで私が使用してタイマーです:

Dim forceExitTimer = New Threading.Timer(Sub() End, Nothing, 2500, Timeout.Infinite) 
    Application.Exit() 
+0

ありがとう!私はちょうど無駄に検索しようとしました:明示的にこれを停止するコードを記述していない場合、 'Application.Exit()'はアプリケーションをシャットダウンできませんでしたか? – Shuri2060

+0

はい。フォームはFormClosingイベントでフォームをブロックできます。あなたがそれらを終了しなければ、スレッドはそれを開いたままにすることもできます。これは主に、正常にシャットダウンするためのアプリへの信号です。それを実現するのは開発者次第ですが、それほど難しいことではありません。最終的に終了することを保証するための出口タイマーについての私の注意を参照してください。 – FloatingKiwi

+0

ありがとう、私は出口タイマーの方法を使用します(私はブロックしたと思った)。 – Shuri2060

関連する問題

 関連する問題