2013-06-06 7 views
24

En C# class Process hérite de class Component qui implémente IDisposable et ainsi je peux appeler Dispose() sur n'importe quel objet Process. Dois-je vraiment? Comment savoir si je dois vraiment le faire?Que fait réellement Process.Dispose()?

Supposons que j'ai le code suivant:

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

Il semble maintenant que j'ai un tableau de Process objets et j'ai un métier try-finally pour traverser la baie et Dispose() chaque objet. C'est certainement beaucoup de code supplémentaire. Qu'est-ce que Dispose() fait pour Process objets? Ai-je vraiment besoin de Dispose() chaque objet Process et comment puis-je décider si j'ai besoin de le faire?

+0

temps de réflecteur? –

Répondre

23

Ai-je vraiment besoin de Dispose() tous les objets Process et comment puis-je décider si je dois le faire?

Oui, vous devez les éliminer. Notez ce texte dans la documentation de Process:

Un processus système est identifié de manière unique sur le système par son identificateur de processus. Comme de nombreuses ressources Windows, un processus est également identifié par son handle, qui peut ne pas être unique sur l'ordinateur. Un handle est le terme générique pour un identifiant d'une ressource. Le système d'exploitation conserve le handle de processus, accessible via la propriété Handle du composant Process, même lorsque le processus s'est arrêté. Ainsi, vous pouvez obtenir les informations administratives du processus, telles que ExitCode (généralement zéro pour la réussite ou un code d'erreur non nul) et ExitTime. Les poignées sont une ressource extrêmement précieuse, de sorte que les poignées qui fuient sont plus virulentes que les fuites de mémoire.

Donc, si vous ne le faites pas Dispose eux, vous laissent échapper des poignées (jusqu'à ce qu'ils soient recueillis ordures - mais le point de l'ensemble de Dispose est de permettre le nettoyage rapide des ressources)


Notez, également, que la même documentation indique que Process annule Dispose(bool) - un autre indice qu'il fait réellement quelque chose lorsque Dispose est appelée.

+1

J'aimerais un 'using (IEnumerable ...)' ici :) – eFloh

+2

@eFloh - pas sûr de ce que vous visez là-bas. Une instruction 'using' introduit une nouvelle variable et une portée dans laquelle cette variable sera utilisée. Ainsi, alors qu'un «usage» ne peut être utilisé que pour des objets jetables, il est presque toujours nécessaire d'utiliser leurs aspects «non jetables» dans ce cadre. –

+0

juste un raccourcisseur syntaqx sympa ... Spécialement pour ces cas où vous avez toute une liste de consommables, il serait bon d'avoir une syntaxe pour finalement les éliminer sans avoir besoin d'un 'finally {foreach (... x. ..) {x.Dispose(); }} ' – eFloh

1

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

appel lorsque vous Evacuer avez fini d'utiliser le composant. La méthode Dispose laisse le composant dans un état inutilisable. Après avoir appelé Dispose, vous devez libérer toutes les références au composant afin que le garbage collector puisse récupérer la mémoire occupée par le composant.

Questions connexes