Wstęp:
Programowanie asynchroniczne stało się popularnym trendem w tworzeniu nowoczesnego oprogramowania. Dwie powszechnie stosowane techniki programowania asynchronicznego w języku C# to Zadania I Wątki . Jednak wielu programistów jest zdezorientowanych różnicami między nimi Zadania I Wątki i kiedy używać każdego z nich. W tym artykule zobaczymy różnice między nimi Zadania I Wątki w C# i podaj wskazówki, kiedy używać każdego z nich.
Czym są zadania?
W języku C# zadanie jest abstrakcją wyższego poziomu służącą do asynchronicznego uruchamiania kodu. Zadanie oznacza jednostkę pracy, która musi zostać wykonana asynchronicznie i może, ale nie musi, zwracać wartość. Zadanie jest zwykle tworzone za pomocą pliku Klasa Fabryki Zadań , który zapewnia kilka metod tworzenia i wykonywania zadań.
Zadania wykorzystują a Pula wątków do wykonania swojej pracy, co oznacza, że Zadania są wykonywane w jednym z Wątków w Pula wątków. Po utworzeniu zadania jest ono dodawane do pliku Kolejka puli wątków , a jeden z wątków w puli jest używany do wykonania zadania. Po zakończeniu zadania wątek wraca do puli, gotowy do wykorzystania w kolejnym zadaniu.
Zadania mają kilka zalet w stosunku do wątków:
- Zadania są lżejsze niż wątki. Zadania zużywają mniej zasobów systemowych, takich jak pamięć i czas procesora, w porównaniu do wątków.
- Zadania są łatwiejsze do zarządzania niż wątki. Zadania zapewniają abstrakcję wyższego poziomu dla programowania asynchronicznego, co ułatwia pisanie i utrzymywanie kodu.
- W niektórych sytuacjach zadania mogą również zapewniać lepszą wydajność niż wątki. Dzieje się tak, ponieważ Zadania używają a Pula wątków , który może efektywniej zarządzać wątkami niż tworzenie i niszczenie wątków dla każdej jednostki pracy.
Czym są wątki?
W języku C# wątek jest abstrakcją niższego poziomu służącą do asynchronicznego uruchamiania kodu. Thread reprezentuje konstrukcję na poziomie systemu operacyjnego, która służy do asynchronicznego wykonywania kodu. Wątek może, ale nie musi, zwracać wartość i zwykle jest tworzony za pomocą metody Klasa wątku .
Wątki korzystają z własnych zasobów, takich jak pamięć i czas procesora, i zazwyczaj są tworzone i niszczone jawnie przez programistę. Kiedy tworzony jest wątek, natychmiast rozpoczyna on wykonywanie i kontynuuje wykonywanie, dopóki nie zostanie jawnie zatrzymany lub nie zakończy swojej pracy.
Wątki mają kilka wad w porównaniu z zadaniami:
- Wątki są cięższe niż Zadania. Wątki zużywają więcej zasobów systemowych, takich jak pamięć i czas procesora, w porównaniu do zadań.
- Zarządzanie wątkami jest trudniejsze niż zadaniami. Wątki wymagają więcej programowania i synchronizacji na niskim poziomie, co utrudnia pisanie i utrzymywanie kodu.
- Wątki mogą również zapewniać gorszą wydajność niż Zadania w niektórych sytuacjach. Dzieje się tak dlatego, że tworzenie i niszczenie wątków dla każdej jednostki pracy może być nieefektywne, szczególnie gdy jest wiele jednostek pracy do wykonania.
Kiedy używać zadań:
Zadania są zalecane, gdy chcesz wykonać jednostkę pracy asynchronicznie i nie potrzebujesz szczegółowej kontroli nad wykonaniem. Zadania doskonale nadają się do wykonywania małych i krótkotrwałych jednostek pracy, takich jak operacje we/wy lub proste obliczenia.
Zadania są również zalecane, gdy chcesz wykorzystać zalety a Pula wątków . A Pula wątków może zarządzać wątkami wydajniej niż tworzenie i niszczenie wątków dla każdej jednostki pracy. Może to skutkować lepszą wydajnością, zwłaszcza gdy istnieje wiele jednostek pracy do wykonania.
Zadania są również przydatne, gdy chcesz łączyć operacje asynchroniczne. Zadania można łączyć za pomocą operatora Wait w celu utworzenia łańcucha operacji asynchronicznych, które będą wykonywane jedna po drugiej. Może to być ważne, jeśli chcesz wykonać serię zależnych operacji asynchronicznych.
Kiedy używać wątków:
Wątków w języku C# należy używać, gdy potrzebna jest szczegółowa kontrola nad wykonaniem i gdy masz określone wymagania, których nie można spełnić za pomocą abstrakcji wyższego poziomu udostępnianych przez Zadania. Oto kilka sytuacji, w których wątki mogą być lepszym wyborem:
Długowieczne jednostki pracy:
Wątki lepiej nadają się do długotrwałych jednostek pracy, takich jak usługi w tle lub złożone obliczenia, które wymagają większej kontroli nad wykonaniem. W takich przypadkach często konieczna jest bardziej szczegółowa kontrola wykonywania kodu niż ta, którą zapewnia Zadania.
Szczegółowa kontrola nad wykonywaniem wątków:
Wątki umożliwiają ustawienie Priorytety wątków, synchronizacja wątków , I Wątek zostaje przerwany . Jeśli chcesz dostosować sposób wykonywania kodu, wątki zapewniają interfejs niskiego poziomu, który pozwala to zrobić.
Programowanie niskiego poziomu:
wyjątki Javy
Wątki wymagają więcej programowania i synchronizacji na niskim poziomie, co może być przydatne, jeśli masz wyspecjalizowane wymagania, których nie można spełnić za pomocą abstrakcji wyższego poziomu udostępnianych przez Zadania.
Współpraca z kodem niezarządzanym:
Jeśli chcesz współpracować z kodem niezarządzanym, jedyną opcją mogą być wątki. W takich przypadkach może być konieczne ręczne utworzenie wątków i kontrolowanie ich, aby upewnić się, że kod działa poprawnie z kodem niezarządzanym.
Rozważania dotyczące wydajności:
W niektórych sytuacjach tworzenie i niszczenie wątków dla każdej jednostki pracy może być nieefektywne, szczególnie gdy jest wiele jednostek pracy do wykonania. W takich przypadkach użycie wątków może być lepszą opcją, ponieważ można je ponownie wykorzystać w wielu jednostkach pracy.