2013-06-06 23 views
24

C#class Processclass Componentから継承し、IDisposableを実装していますので、ProcessオブジェクトでDispose()と呼ぶことができます。私は本当にする必要がありますか?私は本当にする必要があるかどうすればわかりますか?私はProcessオブジェクトの配列を持っていると私は、アレイとDispose()各オブジェクトを通過するクラフトtry-finallyを持っているようProcess.Dispose()は実際に何をしていますか?

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

は、今ではなります

は、私は次のコードがあるとします。それは間違いなくたくさんの追加コードです。

Dispose()Processのオブジェクトはどうなりますか? Processオブジェクトごとに実際にDispose()する必要がありますか、どうすればいいですか?

+0

リフレクタ時間? –

答えて

23

私は本当にすべてのProcessオブジェクトDispose()する必要がありますし、私はそうする必要がある場合、どのように決めるのですか?

はい、それらを処分する必要があります。 Processのドキュメントのこのテキストに注意してください。

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

だから、あなたがそれらをDisposeない場合は、(彼らはゴミを収集しているまで - しかしDisposeの全体のポイントは、リソースの初期のクリーンアップできるようにすることです)、あなたは潜在的にハンドルをリークしている


をそれは実際に Disposeが呼び出される 何かをしていることを別の手掛かり - 同じドキュメントは Processオーバーライド Dispose(bool)ことを示していることにも注意

、、。 MSDNから

+1

私は '(IEnumerable ...)'を好きになるでしょう:) – eFloh

+2

@eFloh - ここで何を目指しているのか分かりません。 'using'ステートメントは、その変数が使用される新しい変数とスコープを導入します。そのため、使い捨てオブジェクトにのみ「使用する」ことができますが、ほとんどの場合、そのスコープ内で「使い捨てではない」アスペクトを使用することになります。 –

+0

ちょうど良いsyntaqxショートナ...特にdisposablesの全リストを持っているこれらのケースでは、最終的に{foreach(... x。 ..){x.Dispose(); }} ' – eFloh

1

:あなたは、コンポーネントの使用を終了するhttp://msdn.microsoft.com/en-us/library/3cc9y48w(v=vs.80).aspx

コール廃棄してください。 Disposeメソッドは、Componentを使用不可能な状態のままにします。 Disposeを呼び出した後、ガベージコレクタがコンポーネントが占有していたメモリを再利用できるように、コンポーネントへのすべての参照を解放する必要があります。

関連する問題