Lorsque le Système est-il.Le filetage.Tâches utiles?
J'ai utilisé la plupart du Filetage de la bibliothèque de manière intensive. Je suis assez familier avec la création de nouveaux Threads, la création de BackgroundWorkers et à l'aide de l'intégré .NET pool de threads (qui sont tous très cool).
Cependant, je n'ai jamais trouvé une raison d'utiliser le Tâche classe. J'ai vu peut-être un ou deux exemples de gens à les utiliser, mais les exemples n'étaient pas très clairs et ils n'ont pas de donner un aperçu de pourquoi il convient d'utiliser une tâche à la place d'un nouveau thread.
Question 1: à Partir d'un haut-niveau, lorsqu'il est à l'aide d'une tâche utile contre l'une des autres méthodes pour le parallélisme .NET?
Question 2: est-ce que quelqu'un a une simple et/ou de difficulté moyenne d'exemple montrant comment utiliser les tâches?
Les tâches (et le TPL) permettre la poursuite de l'abstraction au-dessus de [a]les opérations de synchronisation. Il y a déjà est/était le IAsyncResult de l'interface (qui est souvent utilisé par BeginXYZ/EndXYZ et est utilisé par la Tâche), mais c'est un peu difficile à utiliser. La Tâche de la classe fournit une "inversion" de la technique; au lieu de créer un nouveau IAsyncResult type, une Tâche peut s'exécuter "normal" du code.
Je ne pense pas que votre Question 2 est adapté pour.
Je ne suis pas sûr, mais je pense que “montrez-moi un exemple de X” n'est pas réellement une question, de sorte qu'il n'appartient pas à un Q&comme SI.
Je sais que cette question n'était pas très précis, mais c'était une de ces situations où je savais qu'il pourrait y avoir quelque chose à apprendre, mais je n'étais pas sûr de savoir comment poser correctement la question. Je pense que votre réponse ci-dessous a été parfait!
OriginalL'auteur William | 2012-07-22
Vous devez vous connecter pour publier un commentaire.
Il y a deux avantages principaux à l'aide de
Task
s:Task
peut représenter n'importe quel résultat qui sera disponible dans le futur (le concept général n'est pas spécifique .Net et il est appelé l'avenir), et pas seulement d'un calcul. Ceci est particulièrement important avecasync
-await
, qui utiliseTask
s pour les opérations asynchrones. Depuis l'opération qui obtient le résultat peut échouer,Task
s peuvent aussi représenter des échecs.Task
a beaucoup de méthodes pour les manipuler. Vous pouvez de façon synchrone attendre jusqu'à la fin (Wait()
), attendre son résultat (Result
), mis en place une opération lorsque leTask
finitions (ContinueWith()
) et aussi certaines des méthodes qui fonctionnent sur plusieursTask
s (WaitAll()
,WaitAny()
,ContinueWhenAll()
). Tout cela est possible en utilisant parallèlement d'autres méthodes de traitement, mais vous devez le faire manuellement.Et il y a aussi quelques petits avantages à l'utilisation de
Task
:TaskScheduler
de décider quand et où lesTask
exécuter. Cela peut être utile par exemple si vous voulez exécuter unTâche
sur le thread d'INTERFACE utilisateur, limiter le degré de parallélisme ou avoir unTâche
au niveau des lecteurs–verrou en écriture.Task
s de soutien de la coopérative d'annulation grâce àCancellationToken
.Task
s qui représentent les calculs ont certaines améliorations de performance. Par exemple, ils utilisent de vol de travail de la file d'attente pour un traitement plus efficace et ils prennent également en charge l'in-lining (exécutionTask
qui n'a pas encore commencé sur un thread que de manière synchrone l'attend).Un concept complexe répondu dans un langage simple et clair, des chapeaux!
OriginalL'auteur