112 votes

Existe-t-il des cas où il est préférable d'utiliser un ancien objet Thread au lieu de l'une des nouvelles constructions?

Je vois beaucoup de gens dans les messages du blog et ici DONC, soit d'éviter ou de conseiller à l'encontre de l'utilisation de l' Thread de la classe dans les dernières versions de C# (et je veux dire bien sûr 4.0+, avec l'ajout d' Task & friends). Même avant, il y a eu des débats sur le fait qu'un bon vieux fil de fonctionnalité peut être remplacé dans de nombreux cas par l' ThreadPool classe.

Aussi, d'autres mécanismes sont encore rendu l' Thread classe moins attrayant, comme Timers remplacer le moche Thread + Sleep combo, tandis que pour les Interfaces graphiques, nous avons BackgroundWorker, etc.

Encore, l' Thread semble être un concept familier pour certaines personnes (moi y compris), les gens qui, lorsqu'ils sont confrontés à une tâche qui implique un certain type de l'exécution en parallèle, passez directement à l'aide du bon vieux Thread classe. Je me demandais récemment si il est temps de modifier mes moyens.

Donc ma question est, existe-il des cas où il est nécessaire ou utile d'utiliser un simple vieux Thread objet au lieu de l'un de ces constructions?

107voto

Eric Lippert Points 300275

La classe Thread ne peut pas être rendu obsolète parce qu'évidemment c'est un détail d'implémentation de tous ceux d'autres modèles que vous citez.

Mais ce n'est pas vraiment votre question: votre question est

existe-il des cas où il est nécessaire ou utile d'utiliser un simple vieux Thread objet au lieu de l'un de ces constructions?

Assurez-vous. C'est précisément dans les cas où l'un des plus élevé au niveau des constructions de ne pas répondre à vos besoins.

Mon conseil est que si vous vous trouvez dans une situation où plus de l'abstraction outils ne répondent pas à vos besoins, et vous souhaitez mettre en place une solution à l'aide de threads, alors vous devez identifier ce qui manque à l'abstraction que vous avez vraiment besoin, et ensuite de mettre en œuvre cette abstraction à l'aide de threads, et ensuite utiliser l'abstraction.

52voto

Joey Points 148544

Les Threads sont un bloc de construction de base pour certaines choses (à savoir le parallélisme et l'asynchronie) et ne devraient donc pas être enlevé. Cependant, pour la plupart des gens et la plupart des cas d'utilisation il y a de plus approprié que de choses à utiliser, dont vous avez mentionnés, tels que les pools de threads (qui offrent une belle façon de gérer de nombreux petits boulots en parallèle, sans surcharger la machine par le frai 2000 fils à la fois), en BackgroundWorker (qui encapsule évènements utiles pour une seule courte pièce de travail).

Mais juste parce que dans de nombreux cas, ceux qui sont plus approprié qu'ils protègent le programmeur de inutilement de réinventer la roue, faire des erreurs stupides et autres, cela ne signifie pas que la classe Thread est obsolète. Il est encore utilisé par les abstractions nommé ci-dessus et vous auriez encore besoin d'elle si vous avez besoin d'un contrôle plus fin sur les threads qui n'est pas couvert par la plus classes spéciales.

Dans une veine similaire, .NET ne vous interdit pas l'utilisation de tableaux, malgré List<T> être un meilleur ajustement pour de nombreux cas où les gens utiliser des tableaux. Tout simplement parce que vous pouvez toujours construire des choses qui ne sont pas couverts par la norme lib.

13voto

Brian Rasmussen Points 68853

Task et Thread sont des abstractions différentes. Si vous souhaitez modéliser un thread, la classe Thread reste le choix le plus approprié. Par exemple, si vous devez interagir avec le thread en cours, je ne vois pas de meilleur type pour cela.

Cependant, comme vous le soulignez, .NET a ajouté plusieurs abstractions dédiées qui sont préférables à Thread dans de nombreux cas.

9voto

MiMo Points 7077

L' Thread de la classe n'est pas obsolète, il est toujours utile dans des circonstances particulières.

Où je travaille, nous avons écrit un "processeur d'arrière-plan" dans le cadre d'un système de gestion de contenu: un service Windows qui surveille les répertoires, les adresses e-mail et flux RSS, et à chaque fois quelque chose de nouveau se montre exécuter une tâche sur elle - généralement pour importer les données.

Les tentatives d'utiliser le pool de threads pour que cela ne fonctionne pas: il essaie d'exécuter trop de choses en même temps et de la corbeille des disques, donc nous avons mis en place notre propre interrogation et de l'exécution de système en utilisant directement l' Thread classe.

6voto

Henk Holterman Points 153608

Les nouvelles options directe de l'utilisation et de la gestion de l' (cher), fils de moins en moins fréquentes.

des gens qui, lorsqu'ils sont confrontés à une tâche qui implique un certain type de l'exécution en parallèle, passez directement à l'aide de la bonne vieille classe Thread.

Ce qui est très coûteux et relativement complexe de faire des trucs en parallèle.

Notez que la dépense le plus important: Vous ne pouvez pas utiliser une pleine thread pour faire un petit travail, il serait contre-productif. Le pool de threads de combat les coûts, la Tâche de la classe de la complexité (des exceptions, d'attente et d'annulation).

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