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

Asynch i await / Task

Object Storage Arubacloud
+1 głos
699 wizyt
pytanie zadane 2 lipca 2021 w C# przez tomasz12345 Użytkownik (750 p.)

1. Chciałem zapytać jak to jest z tym TASKiem... od kilku programistów słyszałem takie definicje :

Task - kawałek kodu, który wykonuje się asynchronicznie (czyli bez użycia innych wątków)

Jednak Task.Run() pobiera wątek z ThreadPoola... jedno wyklucza się nieco z drugim...Jak to jest z tymi wątkami?

 

2. asynch / await

Jeśli przykładowo mamy kod, który ma 50 razy Console.WriteLine("Programming") i każde wykonuje się co sekundę ( ustawiony delay 1000ms) , do tego na samym początku mamy funkcję asynchroniczną która wykonuje się 10 sekund ( np. jakies obliczenia ) to po 10 sekundach ( czyli po 10 WriteLine) program wróci do tej funkcji i będzie wypisywał od nowa?

2 odpowiedzi

0 głosów
odpowiedź 2 lipca 2021 przez Wiciorny Ekspert (272,310 p.)

Task - kawałek kodu, który wykonuje się asynchronicznie (czyli bez użycia innych wątków)

co to za bzdura, jeśli task umieszczony jest w jednym wątku, to działa w wątku w obrębie kontekstu, tylko asynchronicznie- nie blokując działania pozostałym operacją, które mogłyby oczekiwać na rezultat / zmiane. 
TASK - nie tworzy nowego wątku, być może inny wątek jest wykorzystywany ponownie bez twojej wiedzy.
W puli wątków jest ich kilka, więc jeśli aplikacja nie wykorzystuje wszystkich to jest brany pierwszy wolny wątek z puli 
Poczytaj o THREAD EXECUTOR  https://stackoverflow.com/questions/1951924/executioncontext-of-threads
Ale nie jest tworzony NOWY WĄTEK 

Jeśli przykładowo mamy kod, który ma 50 razy Console.WriteLine("Programming") i każde wykonuje się co sekundę ( ustawiony delay 1000ms)

To ten kod się wykonuje, a asynchronicznie wykonuje sie operacja 

do tego na samym początku mamy funkcję asynchroniczną która wykonuje się 10 sekund

Przez 10 sekund, więc ona pewnie skończy się szybciej niż trwające operacje wypisywania co sekundę, ale to nie jest tak ze one zostaną uruchomione po zakończeniu, nie przez fakt asynchroniczny tamto wypisywanie trwa, natomiast to ruszyło w momencie kiedy wątek to uruchomił nawet wcześniej i już zakończy swoje działanie, przed końcem wypisywania 


 

komentarz 2 lipca 2021 przez DarthMazut Bywalec (2,990 p.)

Ale nie jest tworzony NOWY WĄTEK 

Domyślnie nie jest, aczkolwiek wg. dokumentacji jeżeli użyjesz TaskCreationOptions.LongRunning to TaskScheduler powinien przydzielić nowy. Więc to nie jest tak, że nigdy nie ma nowego wątku. Ogólnie pula wątków roboczych też pracuje - rozszerza się i kurczy wedle potrzeby.

komentarz 2 lipca 2021 przez Wiciorny Ekspert (272,310 p.)
przydziela nowy wątek z puli, a nie tworzy nowego wątku
komentarz 2 lipca 2021 przez JakSky Stary wyjadacz (14,770 p.)

@DarthMazut, TaskCreationOptions.LongRunning

Nie trzeba nawet i tego. Ostatnio musiałem napisać funkcję, która musiała wysłać 500 tyś żądań i jak sprawdziłem to Task.Run odpalił się w innym wątku automatycznie.

komentarz 2 lipca 2021 przez tomasz12345 Użytkownik (750 p.)

@DarthMazut,
 w takim razie czym rozni się utworzenie nowego wątku od pobrania go z puli wątków??

skoro w puli tworzą się też nowe

komentarz 2 lipca 2021 przez Wiciorny Ekspert (272,310 p.)

w puli tworzone wątki są raz na początku i są one używane w jednym wątku gównym ,wmieniając się zadaniami i odpowiedzialnością, kiedy jeden jest zwalniany, kolejny bierze udział i lub, po prostu kiedy api wymaga jest pobierany, ale nie jest dodatkowo TWORZONY NOWY INNY OSOBNY WĄTEK :) 
 

ula wątków tworzy i niszczy wątki robocze w celu zoptymalizowania przepływności, która jest definiowana jako liczba zadań ukończonych

Istotną problemu jest to: że jeśli tworzysz WĄTEK NIE BĘDĄCY W PULI, to on jest traktowany jako TASK-> zadanie, może blokować inne wątki doprowadzić do dead-lock itd, co nie ma miejsca zwykle w puli, dla normalnej api  

1
komentarz 3 lipca 2021 przez DarthMazut Bywalec (2,990 p.)

Dla mnie ten komentarz jest całkiem niezrozumiały.

w puli tworzone wątki są raz na początku

Co to znaczy? Że wątki robocze tworzone są jednorazowo przy starcie aplikacji i ich liczba jest stała? To wystarczy w pętli uruchomić 100 tasków i zapiąć się debugerem, żeby przekonać się, że ilość wątków roboczych zwiększa się a po skończonej pracy maleje.

że jeśli tworzysz WĄTEK NIE BĘDĄCY W PULI, to on jest traktowany jako TASK

Tak? Thread t = new Thread() jest traktowany jako Task? W którym miejscu? Klasa Thread tworząca wątek istniała na długo przed wprwadzeniem Tasków. 

zadanie, może blokować inne wątki doprowadzić do dead-lock itd, co nie ma miejsca zwykle w puli, dla normalnej api  

Ale, że co? Że na wątku roboczym nie moge zrobić dead-locka? Zadanie blokujące wątki? No to jakaś sekcja krytyczna rozumiem, ale to działa tak samo dla wątków roboczych z puli jak i tych tworzonych ręcznie przez klasę  Thread np.

 @Wiciorny może przeredaguj swój komentarz, bo ja absolutnie nie rozumiem co miałeś na myśli...

1
komentarz 3 lipca 2021 przez DarthMazut Bywalec (2,990 p.)

@tomasz12345,

Task.Run(() => ...)

wykonujesz kod na wątku roboczym, TaskScheduler przydzieli Ci jakiś wolny wątek z puli.

Thread t = new Thread(() => ...)

explicite tworzysz nowy wątek, nie z puli wątków roboczych, który po wystartowaniu wykona przekazany mu kod...

komentarz 3 lipca 2021 przez tomasz12345 Użytkownik (750 p.)
A w jakim celu tworzymy nowy wątek spoza puli, skoro ilosc wątków w puli podobno sama się zwiększa i zmniejsza?
komentarz 3 lipca 2021 przez DarthMazut Bywalec (2,990 p.)

Wyobraź sobie, że robisz aplikację, która wykonuje jakiś skomplikowany, długotrwały algorytm do przetwarzania plików. Użytkownik może przetwarzać sobie tak kilka plików naraz i będzie to trwało powiedzmy ze 20 minut na każdy plik.W takim przypadku nie chcesz kraść wątków roboczych z puli, bo będą one potrzebne do dalszego działania aplikacji, tylko chcesz nowe, dedykowane wątki dla długotrwałych procesów.

Natomiast jeśli i tak użyjesz wątków roboczych dla tych długotrwałych procesów, to TaskScheduler może przydzielić Ci dodatkowe wątki robocze, jeśli uzna, że aplikacja potrzebuje więcej.

Jeśli chodzi o różnicę między wątkiem roboczym a takim stworzonym przez klasę Thread, to nigdy jakoś specjalnie się tym nie interesowałem, natomiast wiem, że Thread ma np.property IsBackground, która pozwala określić, czy wątek ma kontynuować działanie po zakończeniu aplikacji. Wątki robocze z tego co wiem nigdy nie kontynuują pracy po zakończeniu aplikacji. Wydaje mi się jeszcze (z dużym naciskiem na wydaje bo nigdy tego nie sprawdzałem), że nie możesz utworzyć kontrolki na wątku roboczym, dostaniesz InvalidOperationException i komunikat że wątek musi być STA, natomiast na wątku z klasy Thread można utworzyć kontrolkę.

Zerknij tu:
https://stackoverflow.com/questions/1524249/what-is-a-worker-thread-and-its-difference-from-a-thread-which-i-create/30543580

ktoś już zadał takie pytanie :)

EDIT: ehh bez sensu dyskusja, ktoś już odpowiedział na to ładnie:
https://forum.pasja-informatyki.pl/470180/thread-start-vs-task-run-vs-async-await

0 głosów
odpowiedź 2 lipca 2021 przez JakSky Stary wyjadacz (14,770 p.)

Podobne pytania

0 głosów
2 odpowiedzi 1,182 wizyt
pytanie zadane 5 lutego 2020 w C# przez kubekszklany Gaduła (3,190 p.)
+1 głos
2 odpowiedzi 352 wizyt
pytanie zadane 10 marca 2020 w C# przez JakSky Stary wyjadacz (14,770 p.)
+1 głos
0 odpowiedzi 223 wizyt
pytanie zadane 11 marca 2020 w C# przez kubekszklany Gaduła (3,190 p.)

92,684 zapytań

141,590 odpowiedzi

320,076 komentarzy

62,044 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.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...