2012-01-30 4 views
10

Je recherche l'utilisation de la bibliothèque parallèle de tâches pour un projet de travail que je fais et je veux comprendre les avantages/inconvénients des tâches longues. Je n'ai pas encore d'exemple concret, je veux juste comprendre la théorie derrière cela. D'après ce que les pages MSDN disent à propos de task schedulers et de cette SO question, il semblerait qu'il est préférable d'éviter autant que possible les tâches de longue durée afin de ne pas créer de threads en dehors de ThreadPool. Mais dites-vous a eu une tâche qui allait prendre beaucoup de temps pour compléter, au lieu de cela:Bibliothèque Parallèle des Tâches - Tâche Longue Distance vs Plusieurs Continuations

Task.Factory.StartNew(() => DoTimeConsumingWork(), TaskCreationOptions.LongRunning) 

Pourriez-vous essayer de diviser votre travail en petites unités plus rapides de travail et utiliser des continuations de tâches, comme ceci:

Task.Factory 
    .StartNew(() => DoWorkPart1()) 
    .ContinueWith(t => DoWorkPart2()) 
    .ContinueWith(t => DoWorkPart3()) 
    //...etc 

Cette approche serait-elle plus avantageuse ou est-elle trop efficace pour ce qu'elle essaie d'accomplir?

+0

Cela dépend vraiment de ce que vous entendez par * long *. –

Répondre

5

il semblerait que bien qu'il soit préférable d'éviter tâches de longue durée autant que possible

Pas tout à fait correct. Si vous en avez besoin, vous devrez faire/allouer un thread d'une manière ou d'une autre et alors l'option Task with LongRunning est probablement le meilleur choix. Le drapeau informe simplement le planificateur que la tâche peut prendre un certain temps pour que le planificateur puisse anticiper. Il pourrait même ignorer l'option.

Pourriez-vous essayer de diviser votre travail en unités plus petites et plus rapides de travail un

Si vous le pouvez, puis le faire. Mais pas tous les taks sont si facilement séparés.

+0

Je suis d'accord que tous les algorithmes ne peuvent pas être divisés très facilement en plus petits morceaux. Mais si vous le pouviez, serait-il préférable de le faire? Je suppose qu'il utiliserait mieux le TPL que le programmateur en créant un autre thread, ai-je raison? –

+0

Ça pourrait être mieux, mais ce n'est pas certain. D'habitude, je ne dérange pas trop. Vous ne savez pas (ne peut pas savoir) si cela conduit à un thread supplémentaire. –

3

Lorsque vous spécifiez TaskCreationOptions.LongRunning, il attribue généralement un thread dédié depuis l'extérieur du pool de threads.

Je suggère simplement aller pour la classe BackgroundWorker qui fait que votre longue tâche en cours d'exécution sera couru sur un fil dédié séparé au lieu d'un fil de pool de threads

+1

TaskCreationOptions.LongRunning entraîne généralement la création d'un thread dédié. – dtb

Questions connexes