Tworząc różnego rodzaju aplikacje (np. WPF, Windows Forms), prawdopodobnie wiele razy spotykałeś się z problemem chwilowego “zamarzania” aplikacji, podczas gdy ta wykonywała intensywne obliczenia. Aby napisać aplikację, która będzie pozbawiona tego zachowania musisz zaznajomić się z pojęciem współbieżności i asynchroniczności.
Jak się domyślasz, skupie się w tym wpisie głównie na współbieżności, a o asynchroniczności powstanie osobny wpis.
Co daje nam współbieżność?
Efekt chwilowego zamarzania aplikacji to tylko jeden z wielu problemów, które rozwiązuje współbieżność. Jest wiele scenariuszy, przy których wykorzystujemy współbieżność, powinieś zapamiętać chociaż te poniżej, gdyż jest to przydatna wiedza (np. podczas rozmowy o pracę 🙂 ).
Responsywny interfejs użytkownika – po kliknięciu w przycisk proces wykonuje się w tle.
Jednoczesne przetwarzanie żądań – serwis internetowy obsługuje wielu klientów jednocześnie, a nie każdego z osobna.
Programowanie równoległe – niektóre programy, przetwarzające bardzo dużą liczbę informacji wymagają rozłożenia obciązenia na wiele wątków, w celu zdecydowanego przyspieszenia wykonywanych operacji.
Jak kod realizowany jest współbieżnie?
Mechanizm umożliwiający programowi na równoległe wykonywanie kodu nazywany jest wielowątkowością. I tu pojawia się pierwsze fundamentalne pojęcie czyli “wątek“.
Co to jest wątek?
Wątek jest po prostu osobną niezależną scieżką wykonywania kodu. Możemy tworzyć wiele wątków, ponieważ są one tworzone w ramach jednego procesu (Jeden proces może zawierać wiele wątków).
W praktyce: tworzymy nowy wątek (z delegatem jakiejś metody – o tym wkrótce, zobaczysz przykład), wywołujemy metodę Start() i wątek zaczyna realizować kod, który znajdował się we wskazanej przez nas metodzie – proste. Dzięki temu, nasz kod realizowany jest już współbieżnie,a metoda wskazana przez nas nie blokuje realizacji głównego kodu.
Aby utworzyć wątek wystarczy napisać:
Powyższe wątki zostały utworzone, natomiast nic poza tym. Teraz, aby nasze wątki zaczęły pracę, należy wywołać na nich metodę Start().
Otrzymamy
1 2 3 4 5 6 7 8 9 |
DoOtherThings: 0 Wiedza Informatyczna DoOtherThings: 1 DoOtherThings: 2 DoOtherThings: 3 DoOtherThings: 4 DoOtherThings: 5 DoOtherThings: 6 ... |
Przykład 1. Aby lepiej zaobserwować, że kod faktycznie wywołuje się równolegle zmodyfikujmy nasz kod.
Otrzymamy:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
... DoSomething: 17 DoSomething: 18 DoSomething: 19 DoSomething: 20 DoOtherThings: 2 DoOtherThings: 3 DoOtherThings: 4 DoOtherThings: 5 DoOtherThings: 6 DoOtherThings: 7 DoOtherThings: 8 DoOtherThings: 9 DoOtherThings: 10 DoOtherThings: 11 DoOtherThings: 12 DoOtherThings: 13 DoOtherThings: 14 DoOtherThings: 15 DoSomething: 21 DoSomething: 22 DoSomething: 23 DoSomething: 24 ... |