Close()
System.Diagnostics.Processクラスにメソッドが必要ですか?
編集:Process
は、ほぼ瞬時に終了するコンソールアプリケーションを監視しています...
ビリー3
Close()
System.Diagnostics.Processクラスにメソッドが必要ですか?
編集:Process
は、ほぼ瞬時に終了するコンソールアプリケーションを監視しています...
ビリー3
はい。
ただし、これはClose
単にアプリケーションに対してローカルなリソースを解放することと関係があることに注意してください。プロセスを終了しようとはしません。CloseMainWindow()
これを行うには、 (GUIアプリケーションの場合)またはKill()
(任意のアプリケーションの場合)のいずれかを呼び出す必要があります。
Process
クラスはを実装します。IDisposable
厳密に言えば、Dispose
オブジェクトの処理が終了したら、呼び出す必要があります。Dispose
ただし、このような多くのクラスでは、メソッドの公開バージョンはですClose
。
このようなオブジェクトを処理する最も簡単な(そして最も信頼できる)方法は、using
ブロックを使用することです。Dispose
これにより、ブロックの終わりに達するとすぐに変数が自動的に呼び出されます。また、オブジェクトの破棄を妨げる例外からユーザーを保護します。
例えば:
using(System.Diagnostics.Process process = new System.Diagnostics.Process())
{
// set your properties and launch it
// wait for it to exit if you want to, or just let it continue to run
}
これは、これを行うことと機能的に同等です。
System.Diagnostics.Process process = new System.Diagnostics.Process();
try
{
// set your properties and launch it
// wait for it to exit if you want to, or just let it continue to run
}
finally
{
process.Close();
}
(意味的に同等ではなく、機能的に同等であると述べたことに注意してください。実際には、using
ブロックはオブジェクトへの独自のハンドルをとして維持し、ではなくIDisposable
を呼び出します。ただし、この質問には関係ありません。)Dispose
Close
いいえ、必ずしもそうではありません。
通常、Process インスタンスなどの IDisposable は常に Dispose() を呼び出す (または using ステートメントでラップする) ことをお勧めします。ただし、これが適切に記述されていれば、そうしなくても、最終的に GC はファイナライザーですべてのクリーンアップを実行します。
割り当てられたリソースに応じて、これは一定期間メモリ/リソースに重大な「ヒット」を与える場合としない場合があります。プロセスの場合、GC がオブジェクトを収集してファイナライズするまでプロセス ハンドル (比較的小さい) を保持することになりますが、これはおそらくプログラム全体に大きな影響を与えることはありません。
致命的ではありません - ガベージ コレクターはProcess
最終的に のファイナライザーを呼び出し、オブジェクトのリソースはそのようにクリーンアップされます。
ただし、リソースが不要になったらすぐに、直接呼び出すか、コードをブロックClose
にラップして解放することをお勧めします。using
このようにして、ガベージ コレクターの負荷を軽減し、後でではなく少し前にメモリを解放します。
Close
(またはDispose
)オペレーティングシステム全体のリソースを解放します(おそらく比較的少量が許可されます)。これらは、システム上の他のすべてのプロセスと共有するものであるため、良き市民であるためには、できるだけタイムリーにリリースする必要があります。
最終的には、ファイナライザーを実行しているガベージコレクターを介して、またはプロセスが終了したときに解放されます。