2012-01-30 14 views
10

Badam wykorzystanie biblioteki zadań równoległych do projektu roboczego, który robię i chcę zrozumieć zalety/wady długotrwałych zadań. Nie mam jeszcze prawdziwego przykładu, chcę tylko zrozumieć teorię.Biblioteka zadań równoległych - zadanie LongRunning vs wielokrotne kontynuacje

Z tego, co mówią strony MSDN o task schedulers i SO question, wydaje się, że najlepiej jest unikać długotrwałych zadań w jak największym stopniu, tak aby nie tworzyć wątków poza wątkiem ThreadPool. Ale mówią, że miał zadanie który zajmie dużo czasu, aby zakończyć, zamiast tego:

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

można spróbować i podzielić się swoją pracę w mniejszych, szybszych jednostek pracy i używać kontynuacje zadań, jak to:

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

Czy takie podejście byłoby bardziej korzystne, czy też jest przesadą w stosunku do tego, co próbuje osiągnąć?

+0

To naprawdę zależy od tego, co masz na myśli przez * długi *. –

Odpowiedz

5

wydaje się jakby to najlepiej, aby uniknąć długotrwałe zadania w maksymalnym stopniu

Nie do końca poprawne. Jeśli tego potrzebujesz, będziesz musiał/jakoś zaalokować wątek, a wtedy opcja Zadanie z LongRunning jest prawdopodobnie najlepszym wyborem. Flaga po prostu informuje planistę, że zadanie może trochę potrwać, aby planista mógł przewidzieć. Może nawet zignorować opcję.

można spróbować i podzielić się swoją pracę na mniejsze, szybsze jednostki pracy

Jeśli możesz, to zrób to. Ale nie wszystkie są tak łatwo rozdzielone.

+0

Zgadzam się, że nie wszystkie algorytmy można bardzo łatwo podzielić na mniejsze porcje. Ale gdybyś mógł, czy byłoby lepiej to zrobić? Zgaduję, że wykorzystałby TPL lepiej niż program planujący, tworząc kolejny wątek, czy mam rację? –

+0

Może być lepiej, ale to nie jest pewne. Zwykle nie przejmowałem się zbytnio. Nie wiesz (nie możesz) wiedzieć, czy prowadzi to do dodatkowego wątku. –

3

Po określeniu TaskCreationOptions.LongRunning głównie przypisuje dedykowany wątek spoza puli wątków.

Proponuję po prostu pójść na BackgroundWorker klasy, która sprawia, że ​​Twoje zadanie długo uruchomiony będzie prowadził na oddzielnym dedykowanym wątku zamiast wątku z puli wątków

+1

TaskCreationOptions.LongRurrent również zwykle powoduje utworzenie dedykowanego wątku. – dtb

Powiązane problemy