2009-02-10 10 views
0

Une fois que mon application a créé un thread à l'aide d'un délégué ParameterizedThreadStart, ce thread effectue une initialisation et s'exécute jusqu'à la fin. Plus tard, je peux observer que ce thread n'est plus actif car sa propriété IsAlive est false et la propriété ThreadState est ThreadState.Stopped.Nettoyage de thread géré C#

Une fois qu'un thread atteint cet état, il reste dans mon application, il existe toujours en tant qu'objets de threads jusqu'à ce que mon application s'arrête. Y a-t-il des mesures que je peux prendre pour les éliminer une fois qu'elles ne sont plus actives? Je voudrais supprimer l'objet et libérer toutes les ressources afin que les seuls objets threads que je possède soient des threads actifs. Thread n'implémente pas IDisposable, cependant, je ne suis pas sûr de la façon dont je devrais le faire.

Répondre

2

Vous maintenez la référence au thread dans votre code.

Si vous avez un code écrit qui va vérifier l'état du thread, alors ce code gardera intrinsèquement l'objet thread en vie jusqu'à ce que le GC le recueille.

Une fois que vous avez terminé avec un fil, ou idéalement si vous n'avez pas besoin d'y accéder, assurez-vous d'annuler toutes les références à celui-ci. Thread n'implémente pas IDisposable car, comme vous l'avez précisé, cela n'aurait aucun sens pour un thread.

Les threads sont natifs dans .Net, vous n'avez donc pas à vous soucier des fuites. Si vous êtes certain qu'ils s'arrêteront, effacez-les simplement de votre liste dès que vous êtes sûr qu'il est terminé.

+0

Je pensais que cela pourrait être le cas, donc j'ai fait de mon mieux pour supprimer toutes les références à l'objet. En utilisant le débogueur VS, j'ai vérifié l'état de la thread périodiquement, et il est resté un objet thread valide. Je suppose que cela signifie que je suis toujours en train de le référencer quelque part? – Chris

+1

Une fois le débogueur attaché, le GC ne touchera pas l'objet :( – Spence

+2

Utilisez un PROFILER MEMORY pour vérifier les problèmes du GC N'utilisez JAMAIS un débogueur car il change le comportement du GC pour des raisons évidentes (par exemple, maintenir les variables plus actives – TomTom

1

Il semble que vous ayez besoin de lâcher votre référence à l'objet Thread, afin que le garbage collector puisse le supprimer. Définissez simplement la référence que vous avez à null, et laissez le GC faire son travail quand il est prêt. Selon votre situation, vous pouvez utiliser un WeakReference (ou le WeakReference<T> de mon ami Cyrus).

1

Le thread non géré est-il toujours là, le thread est-il réellement renvoyé par sa méthode ParameterizedThreadStart? Essayez aussi de faire IsBackground = false