43

C# ではその実装をclass Process継承しているため、任意のオブジェクトを呼び出すことができます。私は本当にしなければならないのですか?本当に必要かどうかはどうすればわかりますか?class ComponentIDisposableDispose()Process

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

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

これで、オブジェクトの配列があり、配列と各オブジェクトをトラバースするためにProcessaを作成したように見えます。それは間違いなく多くの余分なコードです。try-finallyDispose()

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

4

2 に答える 2

39

本当にDispose()すべてのProcessオブジェクトが必要ですか? また、そうする必要があるかどうかをどのように判断すればよいですか?

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

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

したがって、そうしないDisposeと、ハンドルがリークする可能性があります (ガベージ コレクションが行われるまで - ただし、Disposeリソースの早期クリーンアップを可能にすることが重要です)。


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

于 2013-06-06T08:40:06.587 に答える
0

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

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

于 2013-06-06T08:53:46.137 に答える