Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli.



Podobne dokumenty
Programowanie równoległe i asynchroniczne w C# 5.0 / Mateusz Warczak [et al.]. Gliwice, cop Spis treści

msgbox("akcja: Początek, argument: " + argument.tostring()); Thread.Sleep(1000); //opóźnienie msgbox("akcja: Koniec"); return DateTime.Now.

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli.

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli.

Spis treści 1. Wstęp 2. Projektowanie systemów informatycznych

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli.

INSTRUKCJA OBSŁUGI URZĄDZENIA: HC8201

Instalacja. Zawartość. Wyszukiwarka. Instalacja Konfiguracja Uruchomienie i praca z raportem Metody wyszukiwania...

Bazy danych. Andrzej Łachwa, UJ, /15

Instrukcja Obsługi STRONA PODMIOTOWA BIP

Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych ul. Koszykowa 75, Warszawa

O autorze... 9 Wprowadzenie... 11

Konfiguracja historii plików

PERSON Kraków

Systemy mikroprocesorowe - projekt

SKRÓCONA INSTRUKCJA OBSŁUGI ELEKTRONICZNEGO BIURA OBSŁUGI UCZESTNIKA BADANIA BIEGŁOŚCI

System Informatyczny CELAB. Przygotowanie programu do pracy - Ewidencja Czasu Pracy

Chmura obliczeniowa. do przechowywania plików online. Anna Walkowiak CEN Koszalin

Opis obsługi systemu Ognivo2 w aplikacji Komornik SQL-VAT

W dobie postępującej digitalizacji zasobów oraz zwiększającej się liczby dostawców i wydawców

Zmiany w programie C GEO v. 6.5

Microsoft Management Console

InsERT GT Własne COM 1.0

Spring MVC Andrzej Klusiewicz 1/18

System kontroli wersji SVN

Komunikacja w sieci Industrial Ethernet z wykorzystaniem Protokołu S7 oraz funkcji PUT/GET

Architektura komputerów

Zintegrowane Systemy Zarządzania Biblioteką SOWA1 i SOWA2 SKONTRUM

using System;... using System.Threading;

0.1 Hierarchia klas Diagram Krótkie wyjaśnienie

API transakcyjne BitMarket.pl

Poniżej instrukcja użytkowania platformy

Instrukcja obsługi platformy zakupowej e-osaa (klient podstawowy)

Instrukcja obsługi Norton Commander (NC) wersja 4.0. Autor: mgr inż. Tomasz Staniszewski

DE-WZP JJ.3 Warszawa,

Instrukcja programu PControl Powiadowmienia.

Warszawa, r.

INSTRUKCJA DO PROGRAMU LICZARKA 2000 v 2.56

Elementy i funkcjonalno

Audyt SEO. Elementy oraz proces przygotowania audytu. strona

Pierwsze kroki. Krok 1. Uzupełnienie danych własnej firmy

Logowanie do mobilnego systemu CUI i autoryzacja kodami SMS

Firma Informatyczna JazzBIT

Oprogramowanie klawiatury matrycowej i alfanumerycznego wyświetlacza LCD

Instrukcja zarządzania systemem informatycznym służącym do przetwarzania danych osobowych

Rozliczenia z NFZ. Ogólne założenia. Spis treści

Budowa systemów komputerowych

Regulamin korzystania z serwisu

System do kontroli i analizy wydawanych posiłków

1. Korzyści z zakupu nowej wersji Poprawiono Zmiany w słowniku Stawki VAT Zmiana stawki VAT w kartotece Towary...

ECDL Advanced Moduł AM3 Przetwarzanie tekstu Syllabus, wersja 2.0

GEO-SYSTEM Sp. z o.o. GEO-RCiWN Rejestr Cen i Wartości Nieruchomości Podręcznik dla uŝytkowników modułu wyszukiwania danych Warszawa 2007

INSTRUKCJA RUCHU I EKSPLOATACJI SIECI DYSTRYBUCYJNEJ

Konfiguracja programu Outlook 2007 do pracy z nowym serwerem poczty (Exchange)

Evidence Based Scheduling

HAŚKO I SOLIŃSKA SPÓŁKA PARTNERSKA ADWOKATÓW ul. Nowa 2a lok. 15, Wrocław tel. (71) fax (71) kancelaria@mhbs.

Strategia rozwoju kariery zawodowej - Twój scenariusz (program nagrania).

Ostatnia cena sprzeda y klienta 1.0 dodatek do Symfonia Faktura dla 1 firmy

Praca na wielu bazach danych część 2. (Wersja 8.1)

Kopia zapasowa i odzyskiwanie Podręcznik użytkownika

OmniTouch 8400 Instant Communications Suite 4980 Softphone

Wdrożenie modułu płatności eservice dla systemu Virtuemart 2.0.x

Ogłoszenie o zamiarze udzielenia zamówienia nr 173/2016

Regulamin korzystania z wypożyczalni online Liberetto. z dnia r., zwany dalej Regulaminem

Opis zmian funkcjonalności platformy E-GIODO wprowadzonych w związku z wprowadzeniem możliwości wysyłania wniosków bez podpisu elektronicznego

Archiwum Prac Dyplomowych

INSTRUKCJA WebPTB 1.0

Jak usprawnić procesy controllingowe w Firmie? Jak nadać im szerszy kontekst? Nowe zastosowania naszych rozwiązań na przykładach.

EGZAMIN POTWIERDZAJ CY KWALIFIKACJE W ZAWODZIE Rok 2014 CZ PRAKTYCZNA

Sieć komputerowa grupa komputerów lub innych urządzeo połączonych ze sobą w celu wymiany danych lub współdzielenia różnych zasobów, na przykład:

INTERAKTYWNA APLIKACJA MAPOWA MIASTA RYBNIKA INSTRUKCJA OBSŁUGI

Harmonogramowanie projektów Zarządzanie czasem

DJCONTROL INSTINCT I DJUCED PIERWSZE KROKI

Instrukcja obsługi zamka. bibi-z50. (zamek autonomiczny z czytnikiem identyfikatora Mifare)

Warunki Oferty PrOmOcyjnej usługi z ulgą

Przewodnik AirPrint. Ten dokument obowiązuje dla modeli atramentowych. Wersja A POL

PRAWA ZACHOWANIA. Podstawowe terminy. Cia a tworz ce uk ad mechaniczny oddzia ywuj mi dzy sob i z cia ami nie nale cymi do uk adu za pomoc

Technologie internetowe Internet technologies Forma studiów: Stacjonarne Poziom kwalifikacji: I stopnia. Liczba godzin/tydzień: 2W, 2L

Adres strony internetowej, na której Zamawiający udostępnia Specyfikację Istotnych Warunków Zamówienia:

Dziedziczenie : Dziedziczenie to nic innego jak definiowanie nowych klas w oparciu o już istniejące.

Karta adaptacyjna GSM


Kancelaris - Zmiany w wersji 2.50

Adapter USB do CB32. MDH-SYSTEM ul. Bajkowa 5, Lublin tel./fax lub kom e mail: info@mdh-system.pl

Oprogramowanie FonTel służy do prezentacji nagranych rozmów oraz zarządzania rejestratorami ( zapoznaj się z rodziną rejestratorów FonTel ).

Bioinformatyka Laboratorium, 30h. Michał Bereta

epuap Ogólna instrukcja organizacyjna kroków dla realizacji integracji

G PROGRAMMING. Part #4

WYKŁAD 8. Postacie obrazów na różnych etapach procesu przetwarzania

Polityka prywatności strony internetowej wcrims.pl

Projektowanie bazy danych

Wtedy wystarczy wybrać właściwego Taga z listy.

dbsamples.udl lub przygotowany wcześniej plik dla Excela) i OK,

Projekt z przedmiotu: Aplikacje internetowe i rozproszone. TEMAT: Łamanie haseł. str. 0

Elementy cyfrowe i układy logiczne

VLAN Ethernet. być konfigurowane w dowolnym systemie operacyjnym do ćwiczenia nr 6. Od ćwiczenia 7 należy pracować ć w systemie Linux.

DOTACJE NA INNOWACJE ZAPYTANIE OFERTOWE

PODRĘCZNIK UŻYTKOWNIKA

Regulamin serwisu internetowego ramowka.fm

Transkrypt:

Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Redaktor prowadzący: Ewelina Burska Projekt okładki: Studio Gravite/Olsztyn Obarek, Pokoński, Pazdrijowski, Zaprucki Materiały graficzne na okładce zostały wykorzystane za zgodą Shutterstock. Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/proch5 Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. ISBN: 978-83-246-6698-0 Copyright Helion 2014 Printed in Poland. Oceń książkę Księgarnia internetowa Lubię to!» Nasza społeczność

Spis tre ci Wst p... 9 Przedmowa... 11 Rozdzia 1. Dla niecierpliwych: asynchroniczno i p tla równoleg a... 13 Programowanie asynchroniczne. Operator await i modyfikator async (nowo j zyka C# 5.0 i platformy.net 4.5)... 13 Klasa Parallel z biblioteki TPL (nowo platformy.net 4.0)... 19 Równoleg a p tla For... 20 Przerywanie p tli... 22 Rozdzia 2. W tki... 25 Monte Carlo...25 Obliczenia bez u ycia dodatkowych w tków... 26 Przeniesienie oblicze do osobnego w tku... 28 W tki, procesy i domeny aplikacji... 30 Usypianie bie cego w tku... 31 Przerywanie dzia ania w tku (Abort)... 32 Wstrzymywanie i wznawiane dzia ania w tku... 34 W tki dzia aj ce w tle... 35 Zmiana priorytetu w tku... 36 U ycie wielu w tków i problemy z generatorem liczb pseudolosowych... 36 Pami lokalna w tku i bezpiecze stwo w tku... 39 Czekanie na uko czenie pracy w tku (Join)... 40 Sekcje krytyczne (lock)... 43 Przesy anie danych do w tku... 45 Pula w tków... 47 Jeszcze raz o sygnalizacji zako czenia pracy w tków... 50 Operacje atomowe... 51 Tworzenie w tków za pomoc System.Threading. Timer i imitacja timera w w tku z wysokim priorytetem... 54 Zadania... 57 Rozdzia 3. Zmienne w aplikacjach wielow tkowych... 59 Atrybut ThreadStatic... 59 Opó niona inicjacja i zmienne lokalne w tku... 60 Volatile... 64 Zadania... 65

4 Programowanie równoleg e i asynchroniczne w C# 5.0 Rozdzia 4. Wi cej o synchronizacji w tków. Blokady i sygna y... 67 Problem ucztuj cych filozofów... 68 Problem czytelników i pisarzy... 73 Komunikacja mi dzy w tkami. Problem producenta i konsumenta... 78 Sygnalizacja za pomoc metod Monitor.Pulse i Monitor.Wait... 81 EventWaitHandle i AutoResetEvent... 85 Bariera... 86 Synchronizacja w tków z ró nych procesów. Muteksy i semafory nazwane... 88 Kontrola ilo ci instancji aplikacji... 89 Mutex... 89 Semafor... 91 Zadania... 93 Rozdzia 5. W tki a interfejs u ytkownika... 95 W tki robocze w aplikacjach desktopowych... 95 Przygotowanie projektu aplikacji oraz danych wej ciowych... 96 Wykorzystanie w tków w d ugotrwa ych metodach zdarzeniowych... 99 Synchronizacja w tków z interfejsem u ytkownika w aplikacjach Windows Forms... 104 BackgroundWorker... 110 Synchronizacja w tków z komponentami Windows Presentation Foundation... 114 Projekt graficznego interfejsu u ytkownika... 115 Implementacja metod zdarzeniowych... 117 Bezpieczny dost p do kontrolek WPF... 125 Kontekst synchronizacji... 128 Gro ba zag odzenia w tku interfejsu i asynchroniczna zmiana stanu wspó dzielonych zasobów... 135 Zadania... 136 Rozdzia 6. Zadania... 137 Tworzenie zadania... 137 Praca z zadaniami... 138 Dane przekazywane do zada... 140 Dane zwracane przez zadania... 141 Przyk ad: test liczby pierwszej... 141 Synchronizacja zada... 143 Przyk ad: sztafeta zada... 144 Przerywanie zada... 145 Stan zadania... 149 Fabryka zada... 152 Planista i zarz dzanie kolejkowaniem zada... 155 Ustawienia zada... 159 Zadania... 160 Rozdzia 7. Klasa Parallel. Zrównoleglanie p tli... 161 Równoleg a p tla for... 162 Równoleg a p tla foreach... 163 Metoda Invoke... 164 Ustawienia p tli równoleg ych. Klasa ParallelOptions... 166 Przerywanie p tli za pomoc CancelationToken... 166 Kontrola wykonywania p tli... 168 Synchronizacja p tli równoleg ych. Obliczanie metod Monte Carlo... 169 Partycjonowanie danych... 175 Zadania... 177

Spis tre ci 5 Rozdzia 8. Synchronizacja zada... 179 Blokady (lock)... 179 Sygna y (Monitor.Pulse i Monitor.Wait)... 182 Bariera... 184 Rozdzia 9. Dane w programach równoleg ych... 187 Praca ze zbiorami danych w programowaniu równoleg ym... 187 Wspó bie ne struktury danych... 187 Kolekcja ConcurrentBag... 189 Wspó bie ne kolejka i stos... 189 Praca z BlockingCollection... 190 W asna kolekcja wspó bie na... 193 Agregacja... 197 Agregacje dla kolekcji równoleg ych... 199 PLINQ zrównoleglone zapytania LINQ... 203 Przyk ad zapytania PLINQ... 204 Jak dzia a PLINQ?... 205 Kiedy PLINQ jest wydajne?... 207 Metody przekszta caj ce dane wynikowe... 208 Przerywanie zapyta... 209 Metoda ForAll... 212 Zadania... 213 Rozdzia 10. Synchronizacja kontrolek interfejsu z zadaniami... 215 Zadania w aplikacjach Windows Forms... 215 Zadania w aplikacjach WPF... 219 Aktualizacja interfejsu z wykorzystaniem operatora await... 221 Zadania... 223 Rozdzia 11. Analiza aplikacji wielow tkowych. Debugowanie i profilowanie... 225 Okno w tków (Threads)... 226 Okno zada równoleg ych (Parallel Tasks)... 228 Okno stosów równoleg ych (Parallel Stacks)... 229 Okno równoleg ego ledzenia zmiennych (Parallel Watch)... 230 Concurrency Visualizer... 232 Widok Wykorzystanie CPU... 232 Widok W tki... 233 Widok Rdzenie... 236 Profilowanie aplikacji zewn trznych... 237 Znaczniki... 238 Zadania... 241 Rozdzia 12. Wst p do CCR i DSS... 243 Instalacja rodowiska Microsoft Robotics... 245 Mo liwe problemy z uruchomieniem rodowiska Robotics... 247 Kompilacja i uruchamianie projektów do czonych do ksi ki... 248 CCR i DSS w pigu ce... 249 Czujniki i urz dzenia tworzenie pierwszej us ugi... 249 Serwisy partnerskie... 265 Rozdzia 13. Skalowalne rozwi zanie dla systemów rozproszonych na bazie technologii CCR i DSS... 277 Opó nione uruchamianie... 291 Uruchamianie oblicze na klastrze... 293 Podsumowanie... 298 Zadania... 299

6 Programowanie równoleg e i asynchroniczne w C# 5.0 Rozdzia 14. Wprowadzenie do Reactive Extensions. Zarz dzanie sekwencjami zdarze... 301 Programowanie reaktywne... 302 IObservable<T>... 303 IObserver<T>... 303 Dualizm interaktywno-reaktywny... 304 Obserwator wzorzec projektowy... 305 Platforma Rx... 306 Biblioteki Rx... 307 Gramatyka Rx... 309 Jak korzysta z interfejsów w Rx?... 309 Subskrypcje... 312 LINQ do zdarze... 315 Zimne i gor ce obserwable... 329 Rozdzia 15. Wspó bie no w Rx... 333 Zarz dzanie równoleg o ci... 333 Interfejs IScheduler... 334 Plani ci... 335 Metody SubscribeOn i ObserveOn... 339 S owo o unifikacji... 343 Rozdzia 16. Przyk ady u ycia technologii Rx w aplikacjach WPF... 345 Rysowanie z u yciem Rx... 346 Wyszukiwarka... 353 Rozdzia 17. CUDA w.net... 365 Konfiguracja rodowiska dla CUDAfy.NET... 366 Pierwsze kroki... 368 Hello World, czyli pierwszy program CUDAfy.NET... 370 Emulator GPU... 375 W asno ci GPU... 376 Przekazywanie parametrów do kerneli... 378 Operacje na pami ci globalnej karty graficznej... 380 Pomiar czasu wykonania... 383 Dost p zwarty do pami ci globalnej i pami wspó dzielona... 386 Generator liczb pseudolosowych... 390 FFT na GPU... 392 BLAS... 394 Zadania... 395 Dodatek A Biblioteka TPL w WinRT... 397 Zadania... 398 Struktura SpinWait... 400 Usypianie w tków... 400 Pula w tków... 401 ThreadPoolTimer... 402 Podobie stwa... 403 Przeno na biblioteka... 404 Zadania... 406

Spis tre ci 7 Dodatek B Dobre praktyki programowania aplikacji wielow tkowych... 407 Wprowadzenie... 407 Sekcje krytyczne i zakleszczenia... 407 Wy cig... 411 S owo kluczowe volatile i kontrola p tli wykonywanej w ramach funkcji w tku... 417 Bezpiecze stwo w tków a konstruktory i pola statyczne... 419 Dodatek C Menad er pakietów NuGet... 423 Instalacja NuGet... 423 Korzystanie z NuGet... 425 Skorowidz... 427

8 Programowanie równoleg e i asynchroniczne w C# 5.0

Rozdzia 1. Dla niecierpliwych: asynchroniczno i p tla równoleg a Jacek Matulewski Zgodnie z zasad Pareto, w wi kszo ci przypadków czytelnicy b d potrzebowali tylko znikomej cz ci wiedzy przedstawionej w tej ksi ce. Postanowi em wobec tego w rozdziale 1. opisa dwie nowo ci platformy.net 4.0 i 4.5, które wydaj mi si najwa niejsze i które prawdopodobnie b d najcz ciej u ywane w programach czytelników. Programowanie asynchroniczne. Operator await i modyfikator async (nowo j zyka C# 5.0 i platformy.net 4.5) J zyk C# 5.0 wyposa ony zosta w nowy operator await, u atwiaj cy synchronizacj dodatkowych zada uruchomionych przez u ytkownika. Poni ej zaprezentuj prosty przyk ad jego u ycia, który powinien wyja ni jego dzia anie. Dzia anie tego operatora zwi zane jest ci le z bibliotek TPL (ang. Task Parallel Library) i jej sztandarow klas Task, które zostan omówione w kolejnych rozdzia ach. Jednak podobnie jak w przypadku opisanej ni ej p tli równoleg ej Parallel.For, tak i w przypadku operatora await dog bna znajomo biblioteki TPL nie jest konieczna.

14 Programowanie równoleg e i asynchroniczne w C# 5.0 Spójrzmy na przyk ad widoczny na listingu 1.1, w którym przedstawiam metod zdarzeniow przycisku. Zdefiniowana jest w niej przyk adowa akcja pobieraj ca obiekt typu object, a zwracaj ca liczb ca kowit long. Referencj do niej zapisuj w zmiennej akcja i uruchamiam j (synchronicznie). Czynno owa wprowadza jednosekundowe opó nienie za pomoc metody Thread.Sleep (nale y zadeklarowa u ycie przestrzeni nazw System.Threading 1 ), które oczywi cie opó nia wykonywanie ca ej metody zdarzeniowej po klikni ciu przycisku. W efekcie na jedn sekund aplikacja zamiera. Listing 1.1. Synchroniczne wykonywanie kodu zawartego w akcji private void button1_click(object sender, EventArgs e) Func<object, long> akcja = (object argument) => msgbox("akcja: Pocz tek, argument: " + argument.tostring()); Thread.Sleep(1000); //opó nienie msgbox("akcja: Koniec"); return DateTime.Now.Ticks; ; msgbox("button1_click: Pocz tek"); msgbox("wynik: "+akcja("synchronicznie")); msgbox("button1_click: Koniec"); void msgbox(string komunikat) string taskid = Task.CurrentId.HasValue? Task.CurrentId.ToString() : "UI"; MessageBox.Show("! " + komunikat + " (" + taskid + ")"); W metodzie przedstawionej na listingu 1.2 ta sama akcja wykonywana jest asynchronicznie w osobnym w tku utworzonym przez platform.net na potrzeby zdefiniowanego tu zadania (instancja klasy Task z TPL). Synchronizacja nast puje w momencie odczytania warto ci zadanie.result, czyli warto ci zwracanej przez czynno akcja. Jej sekcja get czeka ze zwróceniem warto ci a do zako czenia akcji wykonywanej przez zadanie, wstrzymuj c do tego czasu w tek, w którym wykonywana jest metoda button1_click. Jest to zatem typowy punkt synchronizacji, cho troch ukryty. Warto zwróci uwag, e po instrukcji zadanie.start(), a przed odczytaniem w asno ci zadanie. Result mog by wykonywane dowolne czynno ci, o ile s niezale ne od warto ci zwróconej przez zadanie. Listing 1.2. U ycie zadania do asynchronicznego wykonania kodu private void button1_click(object sender, EventArgs e) Func<object, long> akcja = (object argument) => 1 Alternatywnie mogliby my u y instrukcji await Task.Delay(1000);, ale wówczas musieliby my oznaczy wyra enie lambda jako async, a wtedy nale a oby referencj do niego zapisa w zmiennej typu Func<object, Task<long>>.

Rozdzia 1. Dla niecierpliwych: asynchroniczno i p tla równoleg a 15 ; msgbox("akcja: Pocz tek, argument: " + argument.tostring()); Thread.Sleep(1000); //opó nienie msgbox("akcja: Koniec"); return DateTime.Now.Ticks; Task<long> zadanie = new Task<long>(akcja, "zadanie"); zadanie.start(); msgbox("akcja zosta a uruchomiona"); if (zadanie.status!= TaskStatus.Running && zadanie.status!=taskstatus.rantocompletion) msgbox("zadanie nie zosta o uruchomione"); else msgbox("wynik: "+zadanie.result); msgbox("button1_click: Koniec"); Nie jest konieczne, aby instrukcja odczytania w asno ci Result znajdowa a si w tej samej metodzie, co uruchomienie zadania nale y tylko do miejsca jej odczytania przekaza referencj do zadania (w naszym przypadku zmienn typu Task<long>). Zwykle referencj t przekazuje si jako warto zwracan przez metod uruchamiaj c zadanie. Przyk ad takiej metody widoczny jest na listingu 1.3. Je eli u ywamy angielskich nazw metod, jest zwyczajem, aby metoda tworz ca i uruchamiaj ca zadanie mia y przyrostek..async. Listing 1.3. Wzór metody wykonuj cej jak czynno asynchronicznie Task<long> DoSomethingAsync(object argument) Func<object, long> akcja = (object _argument) => msgbox("akcja: Pocz tek, argument: " + _argument.tostring()); Thread.Sleep(1000); //opó nienie msgbox("akcja: Koniec"); return DateTime.Now.Ticks; ; Task<long> zadanie = new Task<long>(akcja, argument); zadanie.start(); return zadanie; protected void button1_click(object sender, EventArgs e) msgbox("button1_click: Pocz tek"); Task<long> zadanie = DoSomethingAsync("zadanie-metoda"); msgbox("akcja zosta a uruchomiona"); if (zadanie.status!= TaskStatus.Running && zadanie.status!=taskstatus.rantocompletion) msgbox("zadanie nie zosta o uruchomione"); else msgbox("wynik: " + zadanie.result); msgbox("button1_click: Koniec");

16 Programowanie równoleg e i asynchroniczne w C# 5.0 Po tym wprowadzeniu mo emy przej do omówienia zasadniczego tematu. Wraz z wersjami 4.0 i 4.5 w platformie.net (oraz w platformie Windows Runtime) pojawi o si wiele metod podobnych do przedstawionej powy ej metody DoSomethingAsync (ale oczywi cie w odró nieniu od niej robi cych co po ytecznego). Metody te wykonuj asynchronicznie ró nego typu d ugotrwa e czynno ci. Znajdziemy je w klasie HttpClient, w klasach odpowiedzialnych za obs ug plików (StorageFile, StremWriter, Stream Reader, XmlReader), w klasach odpowiedzialnych za kodowanie i dekodowanie obrazów czy w klasach WCF. Asynchroniczno jest wr cz standardem w aplikacjach Windows 8 z interfejsem Modern UI. I w a nie po to, aby ich u ycie by o (prawie) tak proste jak metod synchronicznych, wprowadzony zosta w C# 5.0 (co odpowiada platformie.net 4.5) operator await. U atwia on synchronizacj dodatkowego zadania tworzonego przez te metody. Nale y jednak pami ta, e metod, w której chcemy u y operatora await, musimy oznaczy modyfikatorem async. Prezentuj to na listingu 1.4. Listing 1.4. Przyk ad u ycia modyfikatora async i modyfikatora await protected async void button1_click(object sender, EventArgs e) msgbox("button1_click: Pocz tek"); Task<long> zadanie = DoSomethingAsync("async/await"); msgbox("akcja zosta a uruchomiona"); long wynik = await zadanie; msgbox("wynik: " + wynik); msgbox("button1_click: Koniec"); Operator await zwraca parametr u yty w klasie parametrycznej Task<>. Zatem w przypadku zadania typu Task<long> b dzie to zmienna typu long. Je eli u yta zosta a wersja nieparametryczna klasy Task, operator zwraca void i s u y jedynie do synchronizacji (nie przekazuje wyniku; nieparametryczna klasa Task nie ma tak e w asno ci Result). Metody oznaczone modyfikatorem async nazywane s w angielskiej dokumentacji MSDN async method. Mo e to jednak wprowadza pewne zamieszanie. Z powodu tej nazwy metody z modyfikatorem async (w naszym przypadku metoda Button1_Click) uto samiane s z metodami wykonuj cymi asynchronicznie jakie czynno ci (a tak w naszym przypadku jest DoSomethingAsync). Osobom poznaj cym dopiero temat cz sto wydaje si, e aby metoda wykonywana by a asynchronicznie, wystarczy doda do jej sygnatury modyfikator async. To nie jest prawda! Mo emy wywo a metod DoSomethingAsync w taki sposób, e umie cimy j bezpo- rednio za operatorem await, np. long wynik = await DoSomethingAsync("async/ await");. Jaki to ma sens? Wykonywanie metody button1_click, w której znajduje si to wywo anie, zostanie wstrzymane a do momentu zako czenia metody DoSomething Async, wi c efekt, jaki zobaczymy na ekranie, b dzie identyczny z wynikiem w przypadku synchronicznym (listing 1.1). Ró nica jest jednak wyra na i to jest zasadnicza nowo, bo instrukcja zawieraj ca operator await nie blokuje w tku, w którym wywo ana zosta a metoda button1_click. Kompilator zawiesza wywo anie metody button1_click, przechodz c do kolejnych czynno ci w miejscu jej wywo ania a do momentu zako czenia uruchomionego zadania. W momencie, gdy to nast pi, w tek wraca do metody

Rozdzia 1. Dla niecierpliwych: asynchroniczno i p tla równoleg a 17 button1_click i kontynuuje jej dzia anie 2. Jednak w programie, na którym w tej chwili testujemy operator await, efektów tego nie zobaczymy. Efekt b dzie widoczny dopiero wtedy, gdy metod button1_click wywo amy z innej metody niech b dzie to metoda zdarzeniowa button2_click zwi zana z drugim przyciskiem. Nale y zauwa y, e w serii instrukcji wywo anie metody oznaczonej modyfikatorem async nie musi si zako czy przed wykonaniem nast pnej instrukcji i w tym sensie jest ona asynchroniczna. Aby tak si sta o, musi w niej jednak zadzia a operator await czekaj cy na wykonanie jakiego zadania (w naszym przyk adzie metody DoSomethingAsync). W efekcie, w scenariuszu przedstawionym na listingu 1.5 metoda button2_click zako czy si przed zako czeniem button1_click. Listing 1.5. Dzia anie modyfikatora async private async void button1_click(object sender, EventArgs e) msgbox("button1_click: Pocz tek"); long wynik = await DoSomethingAsync("async/await"); msgbox("wynik: " + wynik.tostring()); msgbox("button1_click: Koniec"); private void button2_click(object sender, EventArgs e) msgbox("button2_click: Pocz tek"); button1_click(null, null); msgbox("button2_click: Koniec"); Wa na rzecz: samo u ycie operatora await i modyfikatora async nie powoduje utworzenia nowych zada lub w tków! Powoduje jedynie przekazanie na pewien czas sterowania z metody, w której znajduje si operator await i oznaczonej modyfikatorem async, do metody, która j wywo a a, i powrót w momencie uko czenia zadania, na jakie czeka await. Koszt jest zatem niewielki i rozwi zanie to mo e by z powodzeniem stosowane bez obawy o utrat wydajno ci. Ponadto, w a nie z uwagi na wydajno, operator await sprawdza, czy w momencie, w którym dociera do niego sterowanie, metoda asynchroniczna nie jest ju zako czona. Je eli tak, praca kontynuowana jest synchronicznie bez zb dnych skoków. Metoda z modyfikatorem async mo e zwraca warto void tak jak w przedstawionej wy ej metodzie zdarzeniowej button1_click. Jednak w takim przypadku jej dzia anie nie mo e by aden sposób synchronizowane. Po uruchomieniu nie mamy nad ni adnej kontroli. Szczególnie nie mo na u y operatora await ani metody Wait klasy Task, aby poczeka na jej zako czenie. eby to by o mo liwe, metoda z modyfikatorem async musi zwraca referencj Task lub Task<>. Wówczas mo liwe jest u ycie operatora await, za którym mo na zreszt ustawi dowolne wyra enie o warto ci Task 2 Aby taki efekt uzyska bez operatora await, nale a oby u y konstrukcji opartej na funkcjach zwrotnych (ang. callback). W efekcie kod sta by si raczej skomplikowany i przez to podatny na b dy. Warto te zauwa y, e await nie jest prostym odpowiednikiem metody Task.Wait, która po prostu zatrzyma aby bie cy w tek do momentu zako czenia zadania. W przypadku operatora await nast pi przekazanie sterowania do metody wywo uj cej i powrót w momencie zako czenia zadania.

18 Programowanie równoleg e i asynchroniczne w C# 5.0 lub Task<> (zmienne i w asno ci tego typu oraz metody lub wyra enia lambda zwracaj ce warto tego typu 3 ). Przekazane zadanie umo liwia synchronizacj. Ponadto u ycie wersji parametrycznej pozwala na zwrócenie warto ci przekazywanej potem przez operator await. Sprawd my to, tworz c odpowiednik metody button1_click ze zmienion sygnatur (nie mo emy tego zrobi z orygina em, bo jest zwi zany ze zdarzeniem button1.click). Nowa metoda o nazwie DoSomethingMoreAsync widoczna jest na listingu 1.6 4. Usun em argumenty, których i tak nie u ywali my, i zmieni em zwracan warto z void na Task. Dzi ki temu metoda ta nie jest ju typu wystrzel i zapomnij, a mo e by kontrolowana z miejsca uruchomienia (zob. widoczna równie na listingu 1.6 metoda button2_click). Zdziwienie mo e budzi jednak fakt, e za s owem kluczowym return w metodzie DoSomethingMoreAsync wcale nie ma instrukcji tworz cej zwracane przez t metod zadanie (instrukcji return mog oby wcale nie by ). W metodach z modyfikatorem async i zwracaj cych warto Task zadanie jest przypisywane przez kompilator. W ten sposób u atwiona jest wielostopniowa obs uga metod asynchronicznych. Nale y jednak pami ta, e te metody nie tworz nowych zada, a jedynie je przekazuj. Listing 1.6. Metoda async zwracaj ca zadanie private async Task DoSomethingMoreAsync() msgbox("dosomethingmoreasync: Pocz tek"); long wynik = await DoSomethingAsync("async/await"); msgbox("dosomethingmoreasync: Wynik: " + wynik.tostring()); msgbox("dosomethingmoreasync: Koniec"); return; private async void button2_click(object sender, EventArgs e) msgbox("button2_click: Pocz tek"); await DoSomethingMoreAsync(); msgbox("button2_click: Koniec"); A co w przypadku metod async, które mia yby zwraca warto? Za ó my, e metoda DoSomethingMore mia aby zwraca warto typu long (np. warto zmiennej wynik). Wtedy nale y zmieni typ tej metody na Task<long>, a za s owem kluczowym return wstawi warto typu long. Pokazuj to na listingu 1.7. Warto zapami ta, cho to uproszczone stwierdzenie, e w metodach async operator await wy uskuje z typu Task<> parametr, a s owo kluczowe return w metodach async zwracaj ce warto typu Task<> dzia a odwrotnie otacza dowolne obiekty typem Task<>. 3 4 Prawd mówi c, nale a oby to stwierdzenie u ci li, bo nie tylko zadania mog by argumentem operatora await, a ka dy typ, który zwraca metod GetAwaiter. Wi cej informacji dost pnych jest na stronie FAQ zespo u odpowiedzialnego za implementacj mechanizmu async/await w platformie.net (http://blogs.msdn.com/b/pfxteam/archive/2012/04/12/10293335.aspx). Warto zwróci uwag na przyrostek Async. W ko cu jest to teraz metoda, która dzia a asynchronicznie, cho adnego zadania nie tworzy.

Rozdzia 1. Dla niecierpliwych: asynchroniczno i p tla równoleg a 19 Listing 1.7. Metoda async zwracaj ca warto long private async Task<long> DoSomethingMoreAsync() msgbox("dosomethingmoreasync: Pocz tek"); long wynik = await DoSomethingAsync("async/await"); msgbox("dosomethingmoreasync: Wynik: " + wynik.tostring()); msgbox("dosomethingmoreasync: Koniec"); return wynik; private async void button2_click(object sender, EventArgs e) msgbox("button2_click: Pocz tek"); msgbox("button2_click: Wynik: " + await DoSomethingMoreAsync()); msgbox("button2_click: Koniec"); I kolejna sprawa. Co w metodach async dzieje si w przypadku b dów? Nieobs u one wyj tki zg oszone w metodzie z modyfikatorem async i zwracaj ce zadania (Task lub Task<>) s za po rednictwem tych zada przekazywane do metody wywo uj cej. Mo na zatem u y normalnej konstrukcji try..catch, jak na listingu 1.8. Gorzej jest w przypadku metod async zwracaj cych void (typu wystrzel i zapomnij, jak button1_ Click z naszego przyk adu). Wówczas wyj tek przekazywany jest do puli w tków kryj cej si za mechanizmem zada i przechwytywanie wyj tków nic nie da. Listing 1.8. Obs uga wyj tków zg aszanych przez metody async private async void button2_click(object sender, EventArgs e) msgbox("button2_click: Pocz tek"); try msgbox("button2_click: Wynik: " + await DoSomethingMoreAsync()); catch(exception exc) msgbox("button2_click: B d!\n" + exc.message); msgbox("button2_click: Koniec"); Klasa Parallel z biblioteki TPL (nowo platformy.net 4.0) Do platformy.net w wersji 4.0 dodana zosta a biblioteka TPL (ang. Task Parallel Library), która wraz ze zrównoleglonym PLINQ i kolekcjami przystosowanymi do konkurencyjnej obs ugi sk ada si na tzw. Parallel Extensions. Biblioteka TPL nadbudowuje klasyczne w tki, korzystaj c z poznanej ju przed chwil klasy Task (z ang.

20 Programowanie równoleg e i asynchroniczne w C# 5.0 zadanie). Biblioteka ta zostanie dok adnie opisana w nast pnych rozdzia ach. Tu chcia bym skupi si tylko na najcz ciej u ywanym jej elemencie implementacji wspó bie nej p tli For. Równoleg a p tla For Za ó my, e mamy zbiór stu liczb rzeczywistych, dla których musimy wykona jakie stosunkowo czasoch onne czynno ci. W naszym przyk adzie b dzie to obliczanie warto ci funkcji f(x) = arcsin(sin(x)). Funkcja ta powinna z dok adno ci numeryczn zwróci warto argumentu x. Zrobi to, ale nie le si przy tym nam czy funkcje trygonometryczne s do wymagaj ce numerycznie. Dodatkowo powtórzymy te obliczenia kilkakrotnie, aby jeszcze bardziej wyd u y czas oblicze. Kod odpowiedniej metody z projektu aplikacji konsolowej widoczny jest na listingu 1.9. Listing 1.9. Metoda zajmuj ca procesor private static double obliczenia(double argument) for (int i = 0; i < 10; ++i) argument = Math.Asin(Math.Sin(argument)); return argument; Z kolei na listingu 1.10 widoczna jest p tla wykonuj ca owe obliczenia wraz z przygotowaniem tablicy z wynikami. Wyniki te nie s jednak drukowane tablica jest zbyt du a, eby to mia o sens. Poni szy kod zawiera dwie zagnie d one p tle For. Interesuje nas tylko wewn trzna. Zadaniem zewn trznej jest wielokrotne powtórzenie oblicze, co pozwoli nam bardziej wiarygodnie zmierzy czas oblicze. Pomiary te realizujemy na bazie zliczania taktów procesora (System.Environment.TickCount). Listing 1.10. Obliczenia sekwencyjne static void Main(string[] args) //przygotowania int rozmiar = 10000; Random r = new Random(); double[] tablica = new double[rozmiar]; for(int i=0;i<tablica.length;++i) tablica[i] = r.nextdouble(); //obliczenia sekwencyjne int iloscpowtorzen = 100; double[] wyniki = new double[tablica.length]; int start = System.Environment.TickCount; for(int powtorzenia = 0; powtorzenia<iloscpowtorzen;++powtorzenia) for(int i=0;i<tablica.length; ++i) wyniki[i] = obliczenia(tablica[i]); int stop = System.Environment.TickCount; Console.WriteLine("Obliczenia sekwencyjne trwa y " + (stop - start).tostring() + " ms."); /* //prezentacja wyników

Rozdzia 1. Dla niecierpliwych: asynchroniczno i p tla równoleg a 21 string s = "Wyniki:\n"; for(int i=0;i<tablica.length;++i) s += i + ". " + tablica[i] + "?= " + wyniki[i] + "\n"; Console.WriteLine(s); */ Przy u yciu klasy Parallel z przestrzeni nazw System.Threading.Tasks mo na bez wi kszego wysi ku zrównolegli p tl for z metody Main (t z indeksem i). Pokazuje to kod z listingu 1.11. Nale y go doda do metody z listingu 1.10. Listing 1.11. Przyk ad zrównoleglonej p tli for //obliczenia równoleg e start = System.Environment.TickCount; for(int powtorzenia = 0; powtorzenia < iloscpowtorzen; ++powtorzenia) Parallel.For(0, tablica.length, i=> wyniki[i] = obliczenia(tablica[i]); ); stop = System.Environment.TickCount; Console.WriteLine("Obliczenia równoleg e trwa y " + (stop - start).tostring() + " ms."); Metoda Parallel.For jest do intuicyjna w u yciu. Jej dwa pierwsze argumenty okre- laj zakres zmiany indeksu p tli. W naszym przypadku jest on równy [0,1000). Wobec tego do metody podanej w trzecim argumencie przekazywane s liczby od 0 do 999. Trzeci argument jest delegatem, do którego mo na przypisa metod lub, jak w naszym przypadku, wyra enie lambda wywo ywane w ka dej iteracji p tli. Powinna si tam zatem znale zawarto oryginalnej p tli. Metoda Parallel.For automatycznie synchronizuje u ywane przez ni zadania przed zako czeniem, dlatego nie ma zagro enia zamazania danych w ramach kolejnych powtórze (zewn trzna p tla for). To, e tworzenie równoleg ej p tli Parallel.For jest, jak to mówi Anglicy, out of the box, nie oznacza, e automatycznie unikamy wszystkich problemów, jakie w równoleg ych p tlach mog powsta. Szczególnie nale y zwróci uwag na spraw podstawow : mi dzy iteracjami p tli nie mo e by rekurencyjnej zale no ci, a wi c kolejna iteracja nie mo e zale e od warto ci jakie zmiennej policzonej w poprzedniej iteracji. Iteracje w równoleg ej p tli nie s przecie wykonywane w kolejno ci indeksów. Nale y tak e uwa a na ukryte zale no ci rekurencyjne. Przyk adem, w którym kryj si takie zale no ci, jest cho by klasa Random. Nie nale y si spodziewa, e dzi ki u yciu równoleg ej p tli nasze obliczenia przyspiesz tyle razy, ile rdzeni procesora mamy do dyspozycji. Tworzenie i usuwanie zada równie zajmuje nieco czasu. Eksperymentuj c z rozmiarem tablicy i liczb obliczanych sinusów, mo na sprawdzi, e zrównoleglanie op aca si tym bardziej, im d u sze s obliczenia wykonywane w ramach jednego zadania. Dla krótkich zada u ycie równoleg ej p tli mo e wr cz wyd u y ca kowity czas oblicze. W moich testach na komputerze z jednym procesorem dwurdzeniowym czas oblicze zmniejszy si do mniej wi cej czasu oblicze sekwencyjnych. Z kolei przy a o miu rdzeniach czas oblicze równoleg ych spad tylko do nieco ponad.

22 Programowanie równoleg e i asynchroniczne w C# 5.0 Przedstawione w tym rozdziale informacje o klasie Parallel i jej metodzie For nale y traktowa jedynie jako zapowied rozdzia u 7., w którym klasa ta zostanie omówiona bardziej wyczerpuj co. Przerywanie p tli Podobnie jak w klasycznej p tli for, równie w jej równoleg ej wersji mo emy w ka dej chwili przerwa dzia anie p tli. S u y do tego klasa ParallelLoopState, która mo e by przekazana w dodatkowym argumencie metody wykonywanej w ka dej iteracji. Klasa ta udost pnia dwie wa ne metody: Break i Stop. Ró ni si one tym, e pierwsza pozwala na wcze niejsze zako czenie bie cej iteracji, a nast pne nie b d ju uruchamiane, podczas gdy metoda Stop nie tylko natychmiast ko czy bie ce zadanie, ale równie podnosi flag IsStopped, która mo e by sprawdzona we wszystkich uruchomionych wcze niej iteracjach, co powinno by dla nich sygna em do zako czenia dzia ania (je eli programista uwzgl dni to w ich kodzie). Na listingu 1.12 pokazuj przyk ad, w którym p tla jest przerywana, je eli wylosowana zostanie liczba 0. Listing 1.12. Przerywanie p tli równoleg ej private static void przerywaniepetli() Random r = new Random(); long suma = 0; long licznik = 0; string s = ""; //iteracje zostan wykonane tylko dla liczb parzystych //p tla zostanie przerwana wcze niej, je eli wylosowana liczba jest wi ksza od 90 Parallel.For( 0, 10000, (int i, ParallelLoopState stanpetli) => int liczba = r.next(7); //losowanie liczby oczek na kostce if(liczba == 0) s += "0 (Stop);"; stanpetli.stop(); if(stanpetli.isstopped) return; if(liczba % 2 == 0) s += liczba.tostring() + "; "; obliczenia(liczba); suma += liczba; licznik += 1; else s += liczba.tostring() + "; "; );

Rozdzia 1. Dla niecierpliwych: asynchroniczno i p tla równoleg a 23 Console.WriteLine( "Wylosowane liczby: " + s + "\n" + "Liczba pasuj cych liczb: " + licznik + "\n" + "Suma: " + suma + "\n" + " rednia: " + (suma / (double)licznik).tostring());

24 Programowanie równoleg e i asynchroniczne w C# 5.0