2013-06-06 5 views
24

In C# class Process erbt von class Component, die IDisposable implementiert und so kann ich Dispose() auf jedem Process Objekt aufrufen. Muss ich wirklich? Woher weiß ich, ob ich wirklich muss?Was macht Process.Dispose() eigentlich?

Angenommen, ich habe den folgenden Code:

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

Jetzt sieht es aus wie ich ein Array von Process Objekte haben, und ich habe Handwerk eine try-finally das Array und Dispose() jedes Objekt zu durchqueren. Das ist definitiv viel extra Code.

Was macht das Dispose() für Process Objekte? Muss ich wirklich Dispose() alle Process Objekt und wie entscheide ich, ob ich dies tun muss?

+0

Reflektorzeit? –

Antwort

23

Muss Dispose() ich Objekt jedes Process wirklich und wie kann ich entscheiden, ob ich so tun müssen?

Ja, Sie sollten sie entsorgen. Beachten Sie diesen Text in der Dokumentation für Process:

Ein Systemprozess wird im System durch seine Prozesskennung eindeutig identifiziert. Wie bei vielen Windows-Ressourcen wird auch ein Prozess durch sein Handle identifiziert, das auf dem Computer möglicherweise nicht eindeutig ist. Ein Handle ist der Oberbegriff für eine Kennung einer Ressource. Das Betriebssystem behält die Prozesskennung bei, auf die über die Handle-Eigenschaft der Prozesskomponente zugegriffen wird, selbst wenn der Prozess beendet wurde. So können Sie die administrativen Informationen des Prozesses abrufen, z. B. den ExitCode (normalerweise Null für Erfolg oder einen Fehlercode ungleich Null) und ExitTime. Handles sind eine äußerst wertvolle Ressource, daher sind undichte Handles virulenter als Leaking Memory.

Also, wenn Sie dies nicht tun Dispose ihnen, Sie undichte möglicherweise die Griffe (bis sie sind Müll gesammelt - aber der ganze Sinn der Dispose ist früh Bereinigung von Ressourcen zu ermöglichen)


Beachten Sie auch, dass die gleiche Dokumentation zeigt, dass ProcessDispose(bool) überschreibt - ein weiterer Hinweis, dass es tatsächlich etwas ist, wenn Dispose aufgerufen wird.

+1

Ich würde gerne ein 'using (IEnumerable ...)' hier :) – eFloh

+2

@eFloh - nicht sicher, was Sie dort anstreben. Eine 'using'-Anweisung führt eine neue Variable und einen Bereich ein, in dem diese Variable verwendet wird. Während also ein 'using' nur für Einwegobjekte verwendet werden kann, geht es in diesem Bereich fast immer darum, ihre" non-disposable "Aspekte zu nutzen. –

+0

nur ein nettes syntaqx shortener ... Speziell für diese Fälle, in denen Sie eine ganze Liste von Disposables haben, wäre es schön, eine Syntax zu haben, um sie endgültig zu beseitigen, ohne ein 'finally {foreach (... x. ..) {x.Dispose(); }} ' – eFloh

1

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

Anruf entsorgen, wenn Sie die Komponente nicht mehr benötigen. Die Dispose-Methode lässt die Komponente in einem unbrauchbaren Zustand. Nachdem Sie Dispose aufgerufen haben, müssen Sie alle Verweise auf die Komponente freigeben, damit der Garbage Collector den von der Komponente belegten Speicher zurückfordern kann.