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?
Ai-je vraiment besoin de
Dispose()
chaqueProcess
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é.
à 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.