W języku C # 4.0, mamy Task
w System.Threading.Tasks nazw. Jaka jest prawdziwa różnica między Thread
i Task
. Zrobiłem jakiś przykładowy program (pomoc wzięta z MSDN) dla własnego uczenia się
Parallel.Invoke
Parallel.For
Parallel.ForEach
ale mają wiele wątpliwości, ponieważ pomysł nie jest tak jasny.
Początkowo szukałem w Stackoverflow podobnego typu pytania, ale być może z tym tytułem pytania nie byłem w stanie uzyskać tego samego. Jeśli ktoś wie o tym samym typie pytania zamieszczonego tutaj wcześniej, uprzejmie podaj odnośnik do linku.
c#
multithreading
c#-4.0
task-parallel-library
terminology
hippietrail
źródło
źródło
Odpowiedzi:
Zadanie to coś, co chcesz zrobić.
Wątek jest jednym z wielu możliwych pracowników wykonujących to zadanie.
W terminologii .NET 4.0 zadanie reprezentuje operację asynchroniczną. Wątki służą do zakończenia tej operacji poprzez podzielenie pracy na części i przypisanie do osobnych wątków.
źródło
Z punktu widzenia informatyki a
Task
jest przyszłością lub obietnicą . (Niektórzy ludzie używają tych dwóch terminów synchronicznie, inni używają ich inaczej, nikt nie może zgodzić się na dokładną definicję.) ZasadniczoTask<T>
„obietnica” zwróci ciT
, ale nie teraz kochanie, jestem trochę zajęta, dlaczego nie wrócisz później?To
Thread
sposób na spełnienie tej obietnicy. Ale nie każdyTask
potrzebuje zupełnie nowegoThread
. (W rzeczywistości tworzenie wątku jest często niepożądane, ponieważ jest to znacznie droższe niż ponowne użycie istniejącego wątku z puli wątków. Więcej na ten temat za chwilę.) Jeśli wartość, na którą czekasz, pochodzi z systemu plików lub bazy danych lub sieci, nie ma potrzeby, aby wątek siedział i czekał na dane, gdy może obsługiwać inne żądania. Zamiast tegoTask
może zarejestrować wywołanie zwrotne, aby otrzymać wartości, gdy będą gotowe.W szczególności,
Task
czy nie powiedzieć, dlaczego jest to, że zajmuje tak dużo czasu, aby zwrócić wartość. To może być tak, że to zajmuje dużo czasu, aby obliczyć, czy to może, że to zajmuje dużo czasu, aby pobrać. Tylko w pierwszym przypadku użyłbyś aThread
do uruchomieniaTask
. (W .NET wątki są cholernie drogie, więc na ogół chcesz ich unikać w jak największym stopniu i naprawdę używaj ich tylko wtedy, gdy chcesz uruchomić wiele ciężkich obliczeń na wielu procesorach. Na przykład w systemie Windows wątek waży 12 KiByte ( Myślę, że) w Linuksie wątek waży zaledwie 4 KiByte, w Erlang / BEAM nawet zaledwie 400 bajtów. W .NET to 1 MiByte!)źródło
Task
.Wątek
Goły metal, prawdopodobnie nie musisz go używać, prawdopodobnie możesz użyć
LongRunning
zadania i czerpać korzyści z TPL - Task Parallel Library, zawartej w .NET Framework 4 (luty 2002) i wyżej (także .NET Rdzeń).Zadania
Abstrakcja nad wątkami. To korzysta z puli wątków (chyba, że zadanie określić jako
LongRunning
działania, jeśli tak, to nowy wątek jest tworzony pod maską dla Ciebie).Pula wątków
Jak sama nazwa wskazuje: pula wątków. Czy środowisko .NET obsługuje dla Ciebie ograniczoną liczbę wątków? Dlaczego? Ponieważ otwarcie 100 wątków w celu wykonania kosztownych operacji procesora na procesorze z zaledwie 8 rdzeniami zdecydowanie nie jest dobrym pomysłem. Framework zachowa dla ciebie tę pulę, ponownie wykorzystując wątki (nie tworząc / nie zabijając ich przy każdej operacji) i wykonując niektóre z nich równolegle, w taki sposób, aby procesor się nie spalił.
OK, ale kiedy użyć każdego z nich?
Wznów: zawsze używaj zadań.
Zadanie jest abstrakcją, więc jest o wiele łatwiejsze w użyciu. Radzę zawsze starać się używać zadań, a jeśli napotkasz jakiś problem, który powoduje, że musisz samodzielnie poradzić sobie z wątkiem (prawdopodobnie 1% czasu), użyj wątków.
ALE pamiętaj, że:
LongRunning
zadań ( lub wątków ). Ponieważ korzystanie z zadań doprowadziłoby cię do puli wątków z kilkoma zajętymi wątkami i wieloma kolejnymi zadaniami czekającymi na swoją kolej.źródło
Możesz użyć,
Task
aby określić, co chcesz zrobić, a następnie dołączyć toTask
za pomocąThread
. więcTask
byłoby to wykonane w tym nowo utworzonym,Thread
a nie w wątku GUI.Użyj
Task
zTaskFactory.StartNew(Action action)
. Tutaj wykonujesz delegata, więc jeśli nie użyjesz żadnego wątku, zostanie on wykonany w tym samym wątku (wątek GUI). Jeśli wspominasz o wątku, możesz to zrobićTask
w innym wątku. Jest to niepotrzebna praca, ponieważ możesz bezpośrednio wykonać delegata lub dołączyć go do wątku i wykonać go w tym wątku. Więc nie używaj tego. to po prostu niepotrzebne. Jeśli zamierzasz zoptymalizować swoje oprogramowanie, jest to dobry kandydat do usunięcia.** Należy pamiętać, że
Action
jest todelegate
.źródło
Oprócz powyższych punktów dobrze byłoby wiedzieć, że:
źródło
Zwykle używam
Task
do interakcji z Winforms i prostym mechanizmem pracującym w tle, aby nie zamrażał interfejsu użytkownika. tutaj przykład, kiedy wolę używaćTask
VS
Różnica polega na tym, że nie musisz używać
MethodInvoker
krótszego kodu.źródło
Zadanie jest jak operacja, którą chcesz wykonać. Wątek pomaga zarządzać tą operacją przez wiele węzłów procesu. zadanie jest lekką opcją, ponieważ Threading może prowadzić do złożonego zarządzania kodem.
Sugeruję, aby zawsze czytać z MSDN (Best in world)
Zadanie
Wątek
źródło
Zadanie może być postrzegane jako wygodny i łatwy sposób wykonywania czegoś asynchronicznie i równolegle.
Normalnie zadanie jest wszystkim, czego potrzebujesz, nie pamiętam, czy kiedykolwiek użyłem wątku do czegoś innego niż eksperymentowanie.
Możesz osiągnąć to samo za pomocą wątku (z dużym wysiłkiem), jak w przypadku zadania.
Wątek
Zadanie
Zadanie domyślnie korzysta z Threadpool, który oszczędza zasoby, ponieważ tworzenie wątków może być kosztowne. Możesz zobaczyć Zadanie jako abstrakcję wyższego poziomu w wątkach.
Jak wskazuje ten artykuł , zadanie zapewnia następujące zaawansowane funkcje nad wątkiem.
Zadania są dostosowane do wykorzystywania procesorów wieloprocesorowych.
Jeśli system ma wiele zadań, korzysta wewnętrznie z puli wątków CLR, więc nie ma narzutu związanego z tworzeniem dedykowanego wątku za pomocą wątku. Skróć także czas przełączania kontekstu między wieloma wątkami.
Poczekaj na zestaw zadań, bez konstrukcji sygnalizacyjnej.
Możemy łączyć ze sobą zadania, aby wykonywać je jedno po drugim.
Nawiąż relację rodzic / dziecko, gdy jedno zadanie zostanie uruchomione z innego zadania.
Wyjątek zadania podrzędnego można propagować do zadania nadrzędnego.
Obsługa zadań anulowania za pomocą tokenów anulowania.
Implementacja asynchroniczna jest łatwa w użyciu, dzięki słowom kluczowym „async” i „czekaj”.
źródło