2010-06-15 16 views
25

Najwyraźniej metoda TaskFactory.StartNew w .NET 4.0 jest przeznaczona jako zamiennik dla ThreadPool.QueueUserWorkItem (according to this post, anyway). Moje pytanie jest proste: czy ktoś wie, dlaczego?TaskFactory.StartNew versus ThreadPool.QueueUserWorkItem

Czy uzyskuje się lepszą wydajność niż TaskFactory.StartNew? Czy zużywa mniej pamięci? Czy jest to głównie dla dodatkowej funkcjonalności zapewnianej przez klasę Task? W tym ostatnim przypadku, czy jest StartNew prawdopodobnie gorszy od niż od QueueUserWorkItem?

Wydaje mi się, że StartNew rzeczywiście potencjalnie wykorzystać więcej pamięci niż QueueUserWorkItem, ponieważ zwraca Task obiekt z każdej rozmowy i Spodziewam się, że aby doprowadzić do większej alokacji pamięci.

W każdym razie chciałbym wiedzieć, który wariant jest bardziej odpowiedni do scenariusza o wysokiej wydajności.

Odpowiedz

2

Już od wyglądu rzeczy, klasy Zadania zostały zaprojektowane do pracy z nowymi funkcjami równoległymi w .Net 4. Wygląda również na to, że możesz użyć Action lub bezpośrednio podczas uruchamiania/tworzenia zadania. Jest to jednak w 100% przypuszczenie oparte na szturchaniu dokumentów :).

7

Wydajność to ... zależy. Jeśli wykonujesz wiele równoległych zadań, zadania .net 4 będą działać lepiej, a ponadto uzyskasz dokładniejszą kontrolę (bardziej niezawodne anulowanie, możliwość oczekiwania na wiele zadań jednocześnie, możliwość tworzenia relacji rodzic/dziecko zadania, Możliwość określić LongRunning, etc .. itd .. itd.)

Dodatkowo, możliwość określenia własnego TaskScheduler oznacza, że ​​można go dostosować do swoich potrzeb. Wbudowany harmonogram zadań jest znacznie bardziej wielordzeniowy niż stary wątek.

Jeśli chodzi o użycie większej ilości pamięci. Każda nić rezerwuje co najmniej 1 MB pamięci, a niewielka ilość używana do przechowywania obiektu zadania jest nieistotna. Naprawdę myślę, że to ostatni z twoich zmartwień.

+0

domyślny AFAIK TaskScheduler korzysta z puli wątków i nie ma żadnej różnicy między nimi, gdy chcesz wsparcie wielordzeniowych. Facet zrobił nawet kilka testów: http://stackoverflow.com/a/5219311/152291 – prostynick

6

TaskFactory.StartNew jest bardziej odpowiedni do scenariusza wysokiej wydajności.

Zyskujesz produktywność dzięki zestawowi klas w System.Threading.Tasks i opiece nad projektami + integracja z równoległymi pętlami i opcjami.

Zyskujesz także korzyści związane z wydajnością, ponieważ System.Threading.Tasks są oparte na kradzieży pracy w puli wątków, która jest lepsza dla lokalizacji (jeśli ma znaczenie).

-Rick

+0

Witam, Rick, czy możesz mi powiedzieć, kiedy używam Task.Factory.StartNew, czy to bierze wątek z puli i mam 1 mniej wątku w mojej puli? Dzięki –

+1

Task.Factory.StartNew użyje puli wątków .net, więc tak, wątek będzie pochodził z puli – Rick

+0

Czy istnieje sposób na rozpoczęcie nowego wątku, który nie zostanie pobrany z puli wątków? –