J'ai remarqué que System.threading.thread implémente un finisseur mais non identifié. La pratique recommandée est de toujours mettre en œuvre Idisposable lorsqu'un finisseur est mis en œuvre. Jeffrey Richter a écrit que la ligne directrice est "très importante et doit toujours être suivie sans exception ". P>
Alors pourquoi ne pas enfiler l'outil iDisposable? Il semble que la mise en œuvre isisposable serait un changement non rompant qui permettrait un nettoyage déterministe des ressources finalisables du fil. P>
Et une question connexe: puisque le thread est finalisable, dois-je tenir des références pour exécuter des threads pour les empêcher d'être finalisés lors de l'exécution? P>
3 Réponses :
Qu'est-ce que l'élimination d'un fichier code> objet code> faire? La "ressource" dans ce cas a son propre nettoyage naturel - la finition du fil. Notez que le sens de la propriété est absent ... dans le fil d'exécution, vous pouvez toujours utiliser essentiellement, je pense que thread.CurrentTthread code>, alors que ce fil serait vraiment capable de revendiquer une sorte de propriété. P>
thread code> est un cas légèrement inhabituel - il y a une vie à la ressource sous-jacente, mais ce n'est pas quelque chose qui doit être nettoyé explicitement. P>
Étant donné que GestionedthreadId est un entier et peut être lu même avant le début d'un thread, cela suggérerait que quelque chose est attribué lors de la création d'un thread (même si le nombre lui-même). Bien qu'il soit étrange qu'une application crée des objets de 2 + milliards de threads, il semblerait que l'ID soit une ressource qui pourrait être méritée de libération.
@supercat: point intéressant. GestionedTheAidID code> semble être alloué de manière séquentielle - je ne sais pas ce qui se passerait après avoir créé plus de 2 milliards d'entre eux.
Les identifiants semblent être réutilisés lorsque les objets de threads deviennent éligibles pour la finalisation, donc je soupçonnez que le threading.thread est en train de mettre en œuvre finaliser mais non identifiable.
Je ne suis pas sûr que cela couvre. thread code> est, dans de nombreux cas, comme
processus code>, en ce qu'il ne s'agit que d'une poignée à une ressource native - c'est-à-dire. Un thread de système d'exploitation -
processus code> implémente Idisposable, alors pourquoi pas
thread code>? Les deux ont des finaliseurs, par exemple.
C'est probablement parce que vous ne pouvez pas disposer em> d'un fil. Au lieu de cela, vous pouvez le demander de mourir en utilisant Abort () code> ou similaire. P>
Vous pouvez, mais en général, l'utilisation d'avortement n'est pas considérée comme une bonne pratique - assurez-vous simplement que la méthode du thread renvoie (à l'aide d'un bool ou similaire) et le système efface le reste.
C'est une sorte de question de conception, de sorte que toute personne qui n'était pas impliquée dans la construction de cet aspect de .NET ne peut que spéculer. Cela étant dit, Ce blog post fait un bon point: p>
... Mise en œuvre Idisposable ne ferait aucune différence, du moins dans la mise en œuvre actuelle du fil. J'ai augmenté le nombre de threads créés et le nombre de la poignée diminue à un moment donné, il y a donc un mécanisme de fermeture p> blockQuote>
Les threads se nettoient naturellement après eux-mêmes, ils ne sont donc pas une ressource qui doit être gérée au sens typique. P>