43 votes

Que fait réellement Process.Dispose() ?

En C# class Process hérite de class Component qui met en œuvre IDisposable et ainsi je peux appeler Dispose() sur n'importe quel Process objet. Est-ce que je dois vraiment le faire ? Comment puis-je 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 de Process et j'ai créé un try-finally pour parcourir le tableau et Dispose() chaque objet. C'est vraiment beaucoup de code supplémentaire.

Qu'est-ce que cela Dispose() faire pour Process des objets ? Ai-je vraiment besoin de Dispose() chaque Process et comment puis-je décider si je dois le faire ?

40voto

Damien_The_Unbeliever Points 102139

Est-ce que j'ai vraiment besoin de Dispose() chaque 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 identifiant 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 l'identifiant d'une ressource. Le système d'exploitation conserve l'identifiant du processus, auquel on accède par le biais de la propriété Handle du composant Process, même lorsque le processus a quitté. Ainsi, vous pouvez obtenir les informations administratives du processus, telles que l'ExitCode (généralement zéro en cas de succès ou un code d'erreur non nul) et l'ExitTime. Les handles sont une ressource extrêmement précieuse, aussi la fuite de handles est plus virulente que la fuite de mémoire.

Donc si vous ne Dispose vous risquez de perdre les identifiants (jusqu'à ce qu'ils soient récupérés - mais l'objectif de l'opération est d'éviter les pertes de données). Dispose est de permettre un nettoyage précoce des ressources)


Notez également que la même documentation indique que Process Remplacer Dispose(bool) - un autre indice qu'il existe réellement quelque chose quand Dispose s'appelle.

0voto

FatihK Points 4776

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

Appelez le service de mise au rebut lorsque vous 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 pour que le ramasseur de déchets puisse récupérer la mémoire que le composant occupait.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X