10
votes

Pourquoi ne filait-t-il pas l'outil Idisposable?

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 ".

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.

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?


0 commentaires

3 Réponses :


8
votes

Qu'est-ce que l'élimination d'un fichier objet 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 thread.CurrentTthread , alors que ce fil serait vraiment capable de revendiquer une sorte de propriété.

essentiellement, je pense que thread 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.


4 commentaires

É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 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 est, dans de nombreux cas, comme processus , 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 implémente Idisposable, alors pourquoi pas thread ? Les deux ont des finaliseurs, par exemple.



3
votes

C'est probablement parce que vous ne pouvez pas disposer d'un fil. Au lieu de cela, vous pouvez le demander de mourir en utilisant Abort () ou similaire.


1 commentaires

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.



1
votes

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:

... 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

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.


0 commentaires