web-dev-qa-db-fra.com

Que fait Process.Dispose ()?

En C # class Process Hérite de class Component Qui implémente IDisposable et je peux donc appeler Dispose() sur n'importe quel Process objet. Dois-je vraiment le faire? Comment savoir si je dois vraiment le faire?

Supposons que j'ai le code suivant:

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

Maintenant, il semble que j'ai un tableau d'objets Process et j'ai créé un try-finally Pour parcourir le tableau et Dispose() chaque objet. C'est certainement beaucoup de code supplémentaire.

Que fait cette Dispose() pour les objets Process? Ai-je vraiment besoin de Dispose() chaque Process objet et comment puis-je décider si je dois le faire?

35
sharptooth

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

Oui, vous devez les jeter. Notez ce texte dans la documentation pour Process :

Un processus système est identifié de manière unique sur le système par son identifiant de processus. Comme de nombreuses ressources Windows, un processus est également identifié par son descripteur, 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 descripteur de processus, accessible via la propriété Handle du composant Process, même lorsque le processus est terminé. 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 différent de zéro) et ExitTime. Les poignées sont une ressource extrêmement précieuse, les fuites de poignées sont donc plus virulentes que les fuites de mémoire.

Donc, si vous ne les faites pas Dispose, vous risquez de fuir les poignées (jusqu'à ce qu'elles soient récupérées - mais tout l'intérêt de Dispose est de permettre un nettoyage précoce des ressources)


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

35

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

Appelez Dispose lorsque vous avez terminé 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 que le composant occupait.

0
fatihk