web-dev-qa-db-ja.com

Process.Dispose()は実際には何をしますか?

C#では、IDisposableを実装する_class Process_から_class Component_を継承しているため、ProcessオブジェクトでDispose()を呼び出すことができます。私は本当にする必要がありますか?本当にする必要があるかどうかはどうすればわかりますか?

次のコードがあるとします。

_ var allProcesses = System.Diagnostics.Process.GetProcesses();
 var processesNames = processes.Select( p => p.ProcessName );
 // output process names here
_

Processオブジェクトの配列があり、配列をトラバースする_try-finally_と各オブジェクトのDispose()を作成したようです。それは間違いなくたくさんの余分なコードです。

Processオブジェクトに対してDispose()は何をしますか?本当にすべてのProcessオブジェクトをDispose()する必要がありますか。また、そうする必要があるかどうかをどのように判断しますか?

35
sharptooth

本当にすべてのProcessオブジェクトをDispose()する必要があるのでしょうか。

はい、処分してください。 Process のドキュメントのこのテキストに注意してください:

システムプロセスは、プロセスIDによってシステム上で一意に識別されます。多くのWindowsリソースと同様に、プロセスもそのハンドルによって識別されますが、これはコンピューター上で一意ではない場合があります。ハンドルは、リソースの識別子の総称です。オペレーティングシステムは、プロセスが終了した場合でも、ProcessコンポーネントのHandleプロパティを通じてアクセスされるプロセスハンドルを保持します。したがって、ExitCode(通常、成功した場合はゼロまたはゼロ以外のエラーコード)やExitTimeなどのプロセスの管理情報を取得できます。ハンドルは非常に貴重なリソースであるため、ハンドルのリークはメモリのリークよりも危険です。

そのため、それらをDisposeしないと、ハンドルがリークする可能性があります(ガベージコレクションされるまで-しかし、Disposeの目的は、リソースの早期クリーンアップを可能にすることです)


また、同じドキュメントがProcessDispose(bool)をオーバーライドすることを示していることにも注意してください-実際に行う別の手がかりsomethingDisposeが呼び出されたとき。

35

mSDNから: http://msdn.Microsoft.com/en-us/library/3cc9y48w(v = vs.80).aspx

コンポーネントの使用が終了したら、Disposeを呼び出します。 Disposeメソッドは、コンポーネントを使用できない状態のままにします。 Disposeを呼び出した後、コンポーネントへのすべての参照を解放して、ガベージコレクターがコンポーネントが占有していたメモリを解放できるようにする必要があります。

0
fatihk