• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Thread.Start vs Task.Run vs Async Await.

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
1,486 wizyt
pytanie zadane 5 lutego 2020 w C# przez kubekszklany Gaduła (3,250 p.)
Witam, pytanie jak w temacie. Czego najlepiej używać do jakich sytuacji i dlaczego?

2 odpowiedzi

0 głosów
odpowiedź 5 lutego 2020 przez Dorion300 Szeryf (90,250 p.)
wybrane 5 lutego 2020 przez kubekszklany
 
Najlepsza
Thread to wątek, a więc poleceniem Thread.Start tworzysz nowy wątek.
Taski to są zadania, one są umieszczane na ThreadPoolu, czyli na specjalnych wątkach roboczych które są zarządzanie przez odpowiednie klasy.

Samo stworzenie wątku jest dość drogie a więc jakbyśmy stworzyli każdy osobny wątek dla użytkownika który połączy się z serwerem to byśmy marnowali niepotrzebnie zasoby w postaci mocy obliczeniowej.
Jeszcze warto wspomnieć że te wątki byłyby jeszcze wstrzymywane gdyby musiały oczekiwać na dane od użytkownika.

Można ten problem częściowo rozwiązać za pomocą ThreadPoola, czyli tworzysz stałą/dynamiczną pulę wątków które będą istnieć znacznie dłużej i będą wykonywać zlecone im zadania. (Taski)

w .NET ThreadPool jest dość specyficzny, nie możesz stworzyć jej instancję, ona już istnieje i już jest zarządzana.
Jak dobrze pamiętam: domyślna minimalna ilość wątków to dostępna ilość rdzeni logicznych a maksymalna 32767.
Gdy przez dłuższy czas dany wątek nie będzie wykorzystany to umiera (do wartości minimalnej a nawet i mniej gdy zapotrzebowanie jest jeszcze niższe), gdy w kolejce są zaplanowane zadania a wolnych wątków roboczych nie ma to program albo czeka aż jakiś wątek będzie dostępny (gdy osiągniemy maksymalną ilość) albo czeka przez chwilę i umieszcza w nowo utworzonym wątku roboczym (na puli) gdy żaden wątek roboczy nie został "zwolniony".

Taski to są proste zadania, one powstają, żyją, i giną dość szybko.
A więc jeśli operujesz na async/await to może być taka sytuacja że dana metoda (z modyfikatorem async) jest wykonywana po części na jednym wątku roboczym, a druga część (po await) na jeszcze innym wątku.

Czasami tworzenie osobnych asynchronicznych zadań się nie opłaca, więc jeśli dana metoda (z "Async" w tytule) nie musi się wykonywać asynchronicznie to wykonuje polecenia i zwraca już ukończony Task (na przykład chcesz odczytać pojedynczy znak od klienta a ten znak już się znajduje w buforze, a więc odczytanie go będzie bardzo szybkie i bez żadnego czekania), co za tym idzie metoda wykorzystująca async/await nie jest niepotrzebnie rozbijana.

Jeśli się w czymś pomyliłem to proszę mnie poprawić, ale mam nadzieję że dobrze wytłumaczyłem.
komentarz 5 lutego 2020 przez kubekszklany Gaduła (3,250 p.)
Dobra, dzięki za wytłumaczenie, coś tam zrozumiałem ;) A jeszcze mam jedno pytanko, bo mam server który czeka na połączenie i gdy klient się do niego podłączy, to metodą task run wywoływania jest funkcja obsłużenia klienta (logowanie, wymiana informacji) i ta funkcja ma pętlę while i warunek client connected (dopóki klient jest podłączony to słucha i odpowiada), a server nasłuchuje dalej (nasłuchiwanie jest w while true). I jak już napisałem używam do tego task runa, bo funkcja nic nie zwraca więc nie zależy mi na async await. I właściwie zadałem to pytanie żeby się dowiedzieć czy tak może być, czy lepiej zamienić to jakoś na async await.
komentarz 5 lutego 2020 przez Dorion300 Szeryf (90,250 p.)
Wtedy jest to nieefektywne, gdyż w Tasku, czyli na wątku roboczym czekasz na dane czy też wykonujesz operacje IO synchronicznie. (pobierz dane, jeśli nie ma -> to czekaj zatrzymując przy tym cały wątek)
Co za tym idzie, jeżeli będziesz czekał na dane od użytkownika to po prostu wątek roboczy zamiast na przykład wykonywać inne zadania/taski to będzie się po prostu lenić.

Więc również dobrze możesz zrobić nowy, osobny wątek i wyjdzie na to samo. :p

async/await jest potrzebny aby to rozbić, gdy będziesz czekał ("await") na wynik metody np. ReadAsync (na dane klienta) to zamiast czekania w obecnym wątku roboczym, obecne zadanie się kończy i zostanie utworzone nowe zadanie gdy system operacyjny otrzyma dane od klienta. [stworzy nowy Task i wrzuci na ThreadPoola (I ten nowy task będzie kontynuował dalszą część kodu po await)]
–1 głos
odpowiedź 5 lutego 2020 przez Siemił Mądrala (7,380 p.)
Najlepiej korzystaj z async/await. Kod jest wtedy najbardziej czytelny. Gdzie nie możesz zastosować async/await, korzystaj z Tasków. Nie korzystaj natomiast z Thread bezpośrednio. Tworzenie i zarządzanie ręcznie nowymi jest trudne i pamięciożerne.
komentarz 5 lutego 2020 przez kubekszklany Gaduła (3,250 p.)
Kwestia jest taka że do tej pory zazwyczaj używałem tasków, async await raczej rzadko, tasków używałem do uruchmiania kodu w "osobnym procesie" jeśli można to tak nawać, natomiast async await, gdy chciałem poczekać na funkcję, aby się wykonała. Tylko nie wiem czy dobrze robiłem, stąd to pytanie. Są jakieś duże róznice między tymi dwoma? Np. w wydajności?
komentarz 5 lutego 2020 przez JAKUBW Nałogowiec (33,470 p.)
Są różnice w wydajności, tworzenie wątków jest niewydajne jeśli chodzi małe szybkie asynchroniczne zadanka. Taski i asynki mogą być zoptymalizowane pod tym względem i używać tych samych wątków do wielu zadań.

Podobne pytania

+1 głos
2 odpowiedzi 927 wizyt
pytanie zadane 2 lipca 2021 w C# przez tomasz12345 Użytkownik (750 p.)
+1 głos
2 odpowiedzi 384 wizyt
pytanie zadane 10 marca 2020 w C# przez JakSky Stary wyjadacz (14,770 p.)
0 głosów
1 odpowiedź 329 wizyt
pytanie zadane 8 lipca 2018 w C# przez PięćCzySześć Użytkownik (770 p.)

93,103 zapytań

142,077 odpowiedzi

321,562 komentarzy

62,445 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...