Właśnie dowiaduję się o nowych bibliotekach Threading i Parallel w .Net 4
W przeszłości utworzyłbym nowy wątek w ten sposób (jako przykład):
DataInThread = new Thread(new ThreadStart(ThreadProcedure));
DataInThread.IsBackground = true;
DataInThread.Start();
Teraz mogę:
Task t = Task.Factory.StartNew(() =>
{
ThreadProcedure();
});
Jaka jest różnica, jeśli w ogóle?
Dzięki
Odpowiedzi:
Jest duża różnica. Zadania są planowane w puli wątków i mogą być nawet wykonywane synchronicznie, jeśli są odpowiednie.
Jeśli pracujesz w tle przez długi czas, powinieneś to określić, używając odpowiedniej opcji zadania.
Bibliotekę równoległą zadań należy preferować zamiast jawnej obsługi wątków, ponieważ jest ona bardziej zoptymalizowana. Masz również więcej funkcji, takich jak Kontynuacja.
źródło
Zadanie zapewnia wszystkie zalety interfejsu API zadań:
Task.ContinueWith
)Zwróć uwagę, że w obu przypadkach możesz nieco uprościć swój kod za pomocą konwersji grup metod:
źródło
Thread
jest to bardzo niski poziom w porównaniu doTask
(mam post na blogu, który zawiera szczegółowe informacje). W Grand Rapids DevDay wygłaszam wykład w rodzaju „używania Zadań w prawdziwym świecie” . Wykład nazywa się „Thread is Dead”, ponieważ nie ma już takiej potrzebyThread
(chyba że wdrażasz aTaskScheduler
).Thread
martwy, jeśli chodzi o użycie go jako wątku w tle?Thread
można zrobić (lubBackgroundWorker
), czego nie można zrobić bardziej eleganckoTask
i stosownieTaskScheduler
.Thread
?Task
działał na konkretnym wątku, użyj odpowiedniegoTaskScheduler
- npAsyncContextThread
. Jednak zwykle nie jest to konieczne;SynchronizationContext
,ThreadPool
, iConcurrentExclusiveSchedulerPair
planiści są wystarczające dla większości programów.W pierwszym przypadku po prostu rozpoczynasz nowy wątek, podczas gdy w drugim przypadku wchodzisz do puli wątków.
Zadaniem puli wątków jest udostępnianie i odtwarzanie wątków. Pozwala to uniknąć utraty kilku milisekund za każdym razem, gdy potrzebujemy stworzyć nowy wątek.
Dostęp do puli wątków można uzyskać na kilka sposobów:
źródło
Twój pierwszy blok kodu mówi CLR, aby utworzył dla Ciebie wątek (powiedzmy T), który można uruchomić jako tło (użyj wątków puli wątków podczas planowania T). Krótko mówiąc, jawnie prosisz środowisko CLR o utworzenie wątku, abyś mógł coś zrobić i wywołanie metody Start () w wątku, aby rozpocząć.
Twój drugi blok kodu robi to samo, ale deleguje (niejawnie przekazuje) odpowiedzialność za tworzenie wątku (w tle - który ponownie jest uruchamiany w puli wątków) i wątek początkowy za pomocą metody StartNew w implementacji fabryki zadań.
To jest szybka różnica między podanymi blokami kodu. Powiedziawszy to, istnieje kilka szczegółowych różnic, które możesz znaleźć w Google lub zobaczyć inne odpowiedzi od innych współtwórców.
źródło