Tytuł oryginału: Programming C# 5 - pdf.helion.plpdf.helion.pl/csh5pr/csh5pr.pdf · TPL Dataflow...

58

Transcript of Tytuł oryginału: Programming C# 5 - pdf.helion.plpdf.helion.pl/csh5pr/csh5pr.pdf · TPL Dataflow...

Tytuł oryginału: Programming C# 5.0

Tłumaczenie: Piotr Rajca

ISBN: 978-83-246-6984-4

© 2013 Helion S.A.

Authorized Polish translation of the English edition Programming C# 5.0 ISBN 9781449320416 © 2013 Ian Griffiths.

This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same.

All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher.

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.

Wydawnictwo HELION dołożyło wszelkich starań, by zawarte w tej książce informacje były kompletnei rzetelne. Nie bierze jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Wydawnictwo HELION nie ponosi również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce.

Wydawnictwo HELIONul. Kościuszki 1c, 44-100 GLIWICEtel. 32 231 22 19, 32 230 98 63e-mail: [email protected]: 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/csh5prMożesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.

Pliki z przykładami omawianymi w książce można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/csh5pr.zip

Printed in Poland.

• Kup książkę• Poleć książkę • Oceń książkę

• Księgarnia internetowa• Lubię to! » Nasza społeczność

5

Spis tre�ci

Wst�p .......................................................................................................................................17

1. Prezentacja C# ............................................................................................................. 21Dlaczego C#? 21Dlaczego nie C#? 23Najwa�niejsze cechy C# 25

Kod zarz�dzany i CLR 27Ogólno�� jest wa�niejsza od specjalizacji 29Programowanie asynchroniczne 30

Visual Studio 31Anatomia prostego programu 33

Dodawanie projektów do istniej�cej solucji 35Odwo�ania do innych projektów 35Pisanie testu jednostkowego 37Przestrzenie nazw 40Klasy 44Punkt wej�cia do programu 44Testy jednostkowe 45

Podsumowanie 47

2. Podstawy stosowania j�zyka C# ................................................................................49Zmienne lokalne 50

Zakres 55Instrukcje i wyra�enia 58

Instrukcje 59Wyra�enia 60

Komentarze i bia�e znaki 65Dyrektywy preprocesora 67

Symbole kompilacji 67Dyrektywy #error oraz #warning 68Dyrektywa #line 69Dyrektywa #pragma 69Dyrektywy #region i #endregion 70

Poleć książkęKup książkę

6 � Spis tre�ci

Wbudowane typy danych 70Typy liczbowe 71Warto�ci logiczne 80Znaki i �a�cuchy znaków 80Object 81

Operatory 81Sterowanie przep�ywem 87

Decyzje logiczne przy u�yciu instrukcji if 87Wielokrotny wybór przy u�yciu instrukcji switch 89P�tle: while oraz do 91P�tle znane z j�zyka C 92Przegl�danie kolekcji przy u�yciu p�tli foreach 93

Podsumowanie 94

3. Typy ..............................................................................................................................95Klasy 95

Sk�adowe statyczne 98Klasy statyczne 100Typy referencyjne 101

Struktury 106Kiedy tworzy� typy warto�ciowe? 110

Sk�adowe 115Pola 115Konstruktory 117Metody 125W�a�ciwo�ci 130Indeksatory 134Operatory 135Zdarzenia 138Typy zagnie�d�one 138

Interfejsy 140Typy wyliczeniowe 141Inne typy 144

Typy anonimowe 145Typy i metody cz��ciowe 146Podsumowanie 147

4. Typy ogólne ................................................................................................................ 149Typy ogólne 150Ograniczenia 152

Ograniczenia typu 153Ograniczenia typu referencyjnego 155Ograniczenia typu warto�ciowego 157Stosowanie wielu ogranicze� 158

Poleć książkęKup książkę

Spis tre�ci � 7

Warto�ci przypominaj�ce zero 158Metody ogólne 160

Wnioskowanie typu 160Tajniki typów ogólnych 161Podsumowanie 163

5. Kolekcje ...................................................................................................................... 165Tablice 165

Inicjalizacja tablic 168U�ycie s�owa kluczowego params do przekazywania

zmiennej liczby argumentów 169Przeszukiwanie i sortowanie 171Tablice wielowymiarowe 178Kopiowanie i zmiana wielko�ci 181

List<T> 182Interfejsy list i sekwencji 185Implementacja list i sekwencji 189

Iteratory 190Klasa Collection<T> 194Klasa ReadOnlyCollection<T> 195

S�owniki 196S�owniki posortowane 198

Zbiory 200Kolejki i stosy 201Listy po��czone 202Kolekcje wspó�bie�ne 203Krotki 204Podsumowanie 205

6. Dziedziczenie .............................................................................................................207Dziedziczenie i konwersje 208Dziedziczenie interfejsów 210Typy ogólne 211

Kowariancja i kontrawariancja 212System.Object 217

Wszechobecne metody typu object 217Dost�pno�� i dziedziczenie 218Metody wirtualne 220

Metody abstrakcyjne 222Metody i klasy ostateczne 228Dost�p do sk�adowych klas bazowych 229Dziedziczenie i tworzenie obiektów 230Specjalne typy bazowe 234Podsumowanie 235

Poleć książkęKup książkę

8 � Spis tre�ci

7. Cykl �ycia obiektów ................................................................................................... 237Mechanizm odzyskiwania pami�ci 238

Okre�lanie osi�galno�ci danych 239Przypadkowe problemy mechanizmu odzyskiwania pami�ci 242S�abe referencje 244Odzyskiwanie pami�ci 248Tryby odzyskiwania pami�ci 254Przypadkowe utrudnianie scalania 256Wymuszanie odzyskiwania pami�ci 260

Destruktory i finalizacja 261Finalizatory krytyczne 264

Interfejs IDisposable 265Zwalnianie opcjonalne 271

Pakowanie 272Pakowanie danych typu Nullable<T> 276

Podsumowanie 277

8. Wyj�tki ....................................................................................................................... 279ród�a wyj�tków 281

Wyj�tki zg�aszane przez API 282Wyj�tki w naszym kodzie 284B��dy wykrywane przez �rodowisko uruchomieniowe 284

Obs�uga wyj�tków 285Obiekty wyj�tków 286Wiele bloków catch 287Zagnie�d�one bloki try 289Bloki finally 290

Zg�aszanie wyj�tków 292Powtórne zg�aszanie wyj�tków 292Sposób na szybkie zako�czenie aplikacji 295

Typy wyj�tków 296Wyj�tki niestandardowe 298

Wyj�tki nieobs�ugiwane 301Debugowanie i wyj�tki 303

Wyj�tki asynchroniczne 305Podsumowanie 308

9. Delegaty, wyra�enia lambda i zdarzenia .................................................................309Typy delegatów 310

Tworzenie delegatów 311MulticastDelegate — delegaty zbiorowe 314Wywo�ywanie delegatów 316Popularne typy delegatów 318Zgodno�� typów 319Wi�cej ni� sk�adnia 323

Poleć książkęKup książkę

Spis tre�ci � 9

Metody inline 326Przechwytywane zmienne 328Wyra�enia lambda oraz drzewa wyra�e� 335

Zdarzenia 336Standardowy wzorzec delegatów zdarze� 338Niestandardowe metody dodaj�ce i usuwaj�ce zdarzenia 339Zdarzenia i mechanizm odzyskiwania pami�ci 342Zdarzenia a delegaty 344

Delegaty a interfejsy 345Podsumowanie 345

10. LINQ ............................................................................................................................347Wyra�enia zapyta� 348

Jak s� rozwijane wyra�enia zapyta� 351Obs�uga wyra�e� zapyta� 353

Przetwarzanie opónione 357LINQ, typy ogólne oraz interfejs IQueryable<T> 359Standardowe operatory LINQ 361

Filtrowanie 364Selekcja 366Operator SelectMany 369Okre�lanie porz�dku 371Testy zawierania 373Konkretne elementy i podzakresy 375Agregacja 379Operacje na zbiorach 384Operatory dzia�aj�ce na ca�ych sekwencjach z zachowaniem kolejno�ci 384Grupowanie 386Z��czenia 390Konwersje 392

Generowanie sekwencji 396Inne implementacje LINQ 397

Entity Framework 397LINQ to SQL 398Klient WCF Data Services 398Parallel LINQ (PLINQ) 399LINQ to XML 399Reactive Extensions 399

Podsumowanie 400

11. Reactive Extensions ................................................................................................... 401Rx oraz ró�ne wersje .NET Framework 403Podstawowe interfejsy 405

Interfejs IObserver<T> 406Interfejs IObservable<T> 407

Poleć książkęKup książkę

10 � Spis tre�ci

Publikowanie i subskrypcja z wykorzystaniem delegatów 413Tworzenie ród�a przy wykorzystaniu delegatów 413Subskrybowanie obserwowalnych róde� przy u�yciu delegatów 417

Generator sekwencji 418Empty 418Never 418Return 419Throw 419Range 419Repeat 419Generate 420

Zapytania LINQ 421Operatory grupowania 423Operatory Join 424Operator SelectMany 429Agregacja oraz inne operatory zwracaj�ce jedn� warto�� 430Operator Concat 431

Operatory biblioteki Rx 431Merge 432Operatory Buffer i Window 433Operator Scan 440Operator Amb 441DistinctUntilChanged 442

Mechanizmy szereguj�ce 442Okre�lanie mechanizmów szereguj�cych 443Wbudowane mechanizmy szereguj�ce 445

Tematy 447Subject<T> 447BehaviorSubject<T> 448ReplaySubject<T> 449AsyncSubject<T> 449

Dostosowanie 450IEnumerable<T> 450Zdarzenia .NET 452API asynchroniczne 454

Operacje z uzale�nieniami czasowymi 456Interval 456Timer 457Timestamp 458TimeInterval 459Throttle 459Sample 460Timeout 460Operatory okien czasowych 460Delay 461DelaySubscription 461

Podsumowanie 462

Poleć książkęKup książkę

Spis tre�ci � 11

12. Podzespo�y .................................................................................................................463Visual Studio i podzespo�y 463Anatomia podzespo�u 464

Metadane .NET 465Zasoby 465Podzespo�y sk�adaj�ce si� z wielu plików 466Inne mo�liwo�ci formatu PE 467

To�samo�� typu 468Wczytywanie podzespo�ów 471

Jawne wczytywanie podzespo�ów 473Global Assembly Cache 474

Nazwy podzespo�ów 476Silne nazwy 476Numer wersji 480Identyfikator kulturowy 484Architektura procesora 487

Przeno�ne biblioteki klas 488Wdra�anie pakietów 490

Aplikacje dla systemu Windows 8 490ClickOnce oraz XBAP 491Aplikacje Silverlight oraz Windows Phone 492

Zabezpieczenia 493Podsumowanie 494

13. Odzwierciedlanie .......................................................................................................495Typy odzwierciedlania 495

Assembly 498Module 502MemberInfo 503Type oraz TypeInfo 506MethodBase, ConstructorInfo oraz MethodInfo 510ParameterInfo 512FieldInfo 513PropertyInfo 513EventInfo 514

Konteksty odzwierciedlania 514Podsumowanie 516

14. Dynamiczne okre�lanie typów ...................................................................................517Typ dynamic 519S�owo kluczowe dynamic i mechanizmy wspó�dzia�ania 521

Silverlight i obiekty skryptowe 524Dynamiczne j�zyki .NET 525

Poleć książkęKup książkę

12 � Spis tre�ci

Tajniki typu dynamic 526Ograniczenia typu dynamic 526Niestandardowe obiekty dynamiczne 528Klasa ExpandoObject 531

Ograniczenia typu dynamic 531Podsumowanie 534

15. Atrybuty .....................................................................................................................535Stosowanie atrybutów 535

Cele atrybutów 537Atrybuty obs�ugiwane przez kompilator 539Atrybuty obs�ugiwane przez CLR 543

Definiowanie i stosowanie atrybutów niestandardowych 551Typ atrybutu 551Pobieranie atrybutów 553

Podsumowanie 556

16. Pliki i strumienie ........................................................................................................ 557Klasa Stream 558

Po�o�enie i poruszanie si� w strumieniu 560Opró�nianie strumienia 561Kopiowanie 562Length 562Zwalnianie strumieni 564Operacje asynchroniczne 565Konkretne typy strumieni 565

Windows 8 oraz interfejs IRandomAccessStream 566Typy operuj�ce na tekstach 569

TextReader oraz TextWriter 570Konkretne typy do odczytu i zapisu �a�cuchów znaków 572Kodowanie 574

Pliki i katalogi 578Klasa FileStream 578Klasa File 581Klasa Directory 585Klasa Path 586Klasy FileInfo, DirectoryInfo oraz FileSystemInfo 588Znane katalogi 589

Serializacja 590Klasy BinaryReader oraz BinaryWriter 590Serializacja CLR 591Serializacja kontraktu danych 594Klasa XmlSerializer 597

Podsumowanie 598

Poleć książkęKup książkę

Spis tre�ci � 13

17. Wielow�tkowo�� .......................................................................................................599W�tki 599

W�tki, zmienne i wspólny stan 601Klasa Thread 607Pula w�tków 609Powinowactwo do w�tku oraz klasa SynchronizationContext 614

Synchronizacja 618Monitory oraz s�owo kluczowe lock 619Klasa SpinLock 625Blokady odczytu i zapisu 627Obiekty zdarze� 628Klasa Barrier 631Klasa CountdownEvent 632Semafory 632Muteksy 633Klasa Interlocked 634Leniwa inicjalizacja 637Pozosta�e klasy obs�uguj�ce dzia�ania wspó�bie�ne 639

Zadania 640Klasy Task oraz Task<T> 640Kontynuacje 643Mechanizmy szereguj�ce 645Obs�uga b��dów 647Niestandardowe zadania bezw�tkowe 648Zwi�zki zadanie nadrz�dne — zadanie podrz�dne 649Zadania z�o�one 650

Inne wzorce asynchroniczne 651Anulowanie 652Równoleg�o�� 653

Klasa Parallel 653Parallel LINQ 654TPL Dataflow 654

Podsumowanie 655

18. Asynchroniczne cechy j�zyka .................................................................................... 657Nowe s�owa kluczowe: async oraz await 658

Konteksty wykonania i synchronizacji 662Wykonywanie wielu operacji i p�tli 663Zwracanie obiektu Task 666Stosowanie async w metodach zagnie�d�onych 667

Wzorzec s�owa kluczowego await 668Obs�uga b��dów 672

Weryfikacja poprawno�ci argumentów 674Wyj�tki pojedyncze oraz grupy wyj�tków 675Operacje równoleg�e i nieobs�u�one wyj�tki 677

Podsumowanie 678

Poleć książkęKup książkę

14 � Spis tre�ci

19. XAML .......................................................................................................................... 681Platformy XAML 682

WPF 683Silverlight 684Windows Phone 7 686Windows Runtime oraz aplikacje dostosowane

do interfejsu u�ytkownika Windows 8 687Podstawy XAML 688

Przestrzenie nazw XAML oraz XML 689Generowane klasy i kod ukryty 690Elementy podrz�dne 692Elementy w�a�ciwo�ci 692Obs�uga zdarze� 694Wykorzystanie w�tków 695

Uk�ad 696W�a�ciwo�ci 696Panele 702ScrollViewer 712Zdarzenia zwi�zane z uk�adem 712

Kontrolki 713Kontrolki z zawarto�ci� 714Kontrolki Slider oraz ScrollBar 717Kontrolki post�pów 718Listy 719Szablony kontrolek 721Kontrolki u�ytkownika 724

Tekst 725Wy�wietlanie tekstów 725Edycja tekstów 727

Wi�zanie danych 729Szablony danych 732

Grafika 735Kszta�ty 735Bitmapy 736Media 737

Style 738Podsumowanie 739

20. ASP.NET ...................................................................................................................... 741Razor 742

Wyra�enia 743Sterowanie przep�ywem 745Bloki kodu 746Jawne wskazywanie tre�ci 747Klasy i obiekty stron 748Stosowanie innych komponentów 749

Poleć książkęKup książkę

Spis tre�ci � 15

Strony uk�adu 749Strony pocz�tkowe 751

Web Forms 752Kontrolki serwerowe 752Wyra�enia 758Bloki kodu 758Standardowe obiekty stron 759Klasy i obiekty stron 759Stosowanie innych komponentów 760Strony nadrz�dne 760

MVC 762Typowy uk�ad projektu MVC 763Pisanie modeli 769Pisanie widoków 771Pisanie kontrolerów 772Obs�uga dodatkowych danych wej�ciowych 774Generowanie ��czy do akcji 776

Trasowanie 777Podsumowanie 781

21. Wspó�dzia�anie ..........................................................................................................783Wywo�ywanie kodu rodzimego 783

Szeregowanie 784Procesy 32- i 64-bitowe 792Bezpieczne uchwyty 793Bezpiecze�stwo 794

Mechanizm Platform Invoke 795Konwencje wywo�a� 796Obs�uga �a�cuchów znaków 797Nazwa punktu wej�cia 797Warto�ci wynikowe technologii COM 798Obs�uga b��dów Win32 802

Technologia COM 802Czas �ycia obiektów RCW 803Metadane 805Skrypty 811

Windows Runtime 814Metadane 815Typy Windows Runtime 815Bufory 816

Niebezpieczny kod 818C++/CLI i Component Extensions 819Podsumowanie 820

Skorowidz ............................................................................................................................. 821

Poleć książkęKup książkę

16 � Spis tre�ci

Poleć książkęKup książkę

657

ROZDZIA� 18.

Asynchroniczne cechy j�zyka

Podstawow� nowo�ci� wprowadzon� w C# 5.0 jest wsparcie j�zyka dla stosowania i implementa-cji metod asynchronicznych. Metody asynchroniczne s� niejednokrotnie najbardziej wydajnymsposobem korzystania z niektórych us�ug. Na przyk�ad wi�kszo�� operacji wej�cia-wyj�ciajest wykonywana asynchronicznie przez j�dro systemu operacyjnego, gdy� wi�kszo�� urz�-dze� peryferyjnych, takich jak kontrolery dysków lub karty sieciowe, jest w stanie wykonywa�wi�kszo�� operacji autonomicznie. Wymagaj� u�ycia procesora wy��cznie podczas rozpoczy-nania i zaka�czania operacji.

Cho� wiele us�ug dostarczanych przez system Windows ma w rzeczywisto�ci asynchronicznycharakter, to jednak programi�ci cz�sto decyduj� si� na korzystanie z nich przy u�yciu metodsynchronicznych (czyli takich, które ko�cz� si� przed wykonaniem tego, co mia�y zrobi�).Jednak takie post�powanie jest marnowaniem zasobów, gdy� powoduje ono zablokowaniew�tku a� do momentu zako�czenia operacji wej�cia-wyj�cia. W systemie Windows w�tkis� cennym zasobem, dlatego te� uzyskuje on najwy�sz� wydajno��, gdy liczba dzia�aj�cychw nim w�tków systemowych jest stosunkowo niewielka. W idealnym przypadku liczba w�tkówsystemowych b�dzie odpowiada� liczbie w�tków sprz�towych, lecz jest to przypadek opty-malny, wy��cznie je�li mo�emy zagwarantowa�, �e w�tki b�d� blokowane tylko w sytuacjach,gdy nie maj� �adnych innych prac do wykonania. (Ró�nice pomi�dzy w�tkami systemowymioraz w�tkami sprz�towymi zosta�y wyja�nione w rozdziale 17.) Im wi�cej w�tków b�dzieblokowanych w wywo�aniach metod synchronicznych, tym wi�cej b�dziemy potrzebowaliw�tków do obs�ugi obci��enia, a to z kolei prowadzi do ograniczenia wydajno�ci. Dlatego te�w kodzie, w którym wydajno�� dzia�ania odgrywa bardzo du�� rol�, metody asynchronicznes� u�yteczne, gdy� zamiast marnowa� zasoby poprzez zmuszanie w�tku do oczekiwaniana zako�czenie operacji wej�cia-wyj�cia, w�tek mo�e zainicjowa� tak� operacj�, a nast�pniew mi�dzyczasie zaj�� si� czym� innym.

Jednak problem z metodami asynchronicznymi polega na tym, �e ich stosowanie jest znacz�-co bardziej z�o�one od korzystania z metod synchronicznych, zw�aszcza kiedy w gr� wcho-dzi koordynacja wielu powi�zanych ze sob� operacji oraz obs�uga b��dów. To w�a�nie z tegopowodu programi�ci bardzo cz�sto wybieraj� mniej wydajne, synchroniczne rozwi�zania.Jednak nowe, asynchroniczne mo�liwo�ci j�zyka C# 5.0 pozwalaj� na tworzenie kodu, którymo�e korzysta� z wydajnych, asynchronicznych API, zachowuj�c przy tym jednocze�nie znaczn�cz��� prostoty cechuj�cej kod u�ywaj�cy prostszych rozwi�za� synchronicznych.

Poleć książkęKup książkę

658 � Rozdzia� 18. Asynchroniczne cechy j�zyka

Nowe mo�liwo�ci j�zyka przydaj� si� tak�e w niektórych przypadkach, gdy g�ównym celemzapewnienia wydajno�ci dzia�ania nie jest maksymalizacja przepustowo�ci. W przypadku koduaplikacji klienckich bardzo wa�nym zagadnieniem jest unikanie blokowania w�tku obs�ugi in-terfejsu u�ytkownika, a jednym z rozwi�za� jest stosowanie metod asynchronicznych. Wsparciedla kodu asynchronicznego, jakie zapewnia C#, jest w stanie obs�ugiwa� problemy zwi�zanez powinowactwem do w�tku, co w ogromnym stopniu u�atwia tworzenie kodu obs�ugi interfejsuu�ytkownika zapewniaj�cego b�yskawiczn� reakcj� na poczynania u�ytkownika aplikacji.

Nowe s�owa kluczowe: async oraz awaitC# udost�pnia wsparcie dla programowania asynchronicznego, wprowadzaj�c dwa s�owakluczowe: async oraz await. Pierwsze z nich nie jest przeznaczone do samodzielnego u�ycia.Umieszcza si� je natomiast w deklaracjach metod, a jego zadaniem jest poinformowaniekompilatora, �e w metodzie b�d� u�ywane mo�liwo�ci asynchroniczne. Je�li s�owo to nie zo-stanie umieszczone w deklaracji metody, to nie b�dzie jej mo�na u�ywa� wraz ze s�owemkluczowym await. Jest to prawdopodobnie nieco nadmiarowe — kompilator zg�asza b��d, je�lispróbujemy u�y� s�owa kluczowego await bez async, czyli najwyraniej jest w stanie okre-�li�, czy cia�o metody próbuje korzysta� z mo�liwo�ci asynchronicznych. A zatem dlaczegomusimy jawnie deklarowa� asynchroniczno�� metody? Otó� wynika to z dwóch powodów.Przede wszystkim, jak si� niebawem przekonasz, te mo�liwo�ci drastycznie zmieniaj� za-chowanie kodu generowanego przez kompilator, dlatego te� stanowi to wyrany sygna� in-formuj�cy wszystkie osoby przegl�daj�ce kod, �e metoda dzia�a w sposób asynchroniczny.A poza tym s�owo await nie zawsze by�o s�owem kluczowym j�zyka C#, zatem wcze�niej nicnie sta�o na przeszkodzie, by u�ywa� go jako identyfikatora. By� mo�e firma Microsoft mog�azaprojektowa� gramatyk� s�owa await w taki sposób, by by�o ono traktowane jako s�owokluczowe wy��cznie w bardzo specyficznych kontekstach, dzi�ki czemu we wszystkich innychprzypadkach mog�oby wci�� by� traktowane jako zwyczajny identyfikator. Niemniej jednaktwórcy j�zyka C# zdecydowali si� zastosowa� nieco bardziej ogólne podej�cie: otó� s�owaawait nie mo�na u�ywa� jako identyfikatora wewn�trz metod, w których deklaracji zasto-sowano modyfikator async, natomiast we wszystkich pozosta�ych miejscach kodu mo�e onos�u�y� za identyfikator.

S�owo kluczowe async nie zmienia sygnatury metody. Determinuje ono sposóbkompilacji metody, a nie jej u�ywania.

A zatem modyfikator async jedynie deklaruje ch�� u�ywania s�owa kluczowego await. (Cho�nie wolno nam u�ywa� s�owa kluczowego await bez async, to jednak nie jest b��dem umiesz-czanie modyfikatora async w deklaracji metody, która nie wykorzystuje s�owa kluczowegoawait. Niemniej jednak takie rozwi�zanie nie ma �adnego sensu, dlatego te� je�li wyst�pi,kompilator wygeneruje ostrze�enie). Listing 18.1 przedstawia dosy� typowy przyk�ad metodyasynchronicznej. U�ywa ona klasy HttpClient1, by poprosi� jedynie o nag�ówki konkretnegozasobu (u�ywaj�c w tym celu standardowego ��dania HEAD, które istnieje w protokole HTTP

1 Zosta�a ona tutaj zastosowana zamiast prostszej klasy WebClient, której u�ywali�my w przyk�adach przed-

stawianych w poprzednich rozdzia�ach, gdy� zapewnia wi�ksz� kontrol� nad szczegó�ami wykorzystaniaprotoko�u HTTP.

Poleć książkęKup książkę

Nowe s�owa kluczowe: async oraz await � 659

w�a�nie do tego celu). Uzyskane wynik s� nast�pnie wy�wietlane w polu tekstowym stano-wi�cym element interfejsu u�ytkownika aplikacji — metoda ta stanowi fragment kodu ukry-tego, obs�uguj�cego interfejs u�ytkownika aplikacji, który zawiera pole TextBox o nazwieheaderListTextBox.

Listing 18.1. Stosowanie s�ów kluczowych async i await podczas pobierania nag�ówków HTTP

private async void FetchAndShowHeaders(string url){ using (var w = new HttpClient()) { var req = new HttpRequestMessage(HttpMethod.Head, url); HttpResponseMessage response = await w.SendAsync(req, HttpCompletionOption.ResponseHeadersRead);

var headerStrings = from header in response.Headers select header.Key + ": " + string.Join(",", header.Value);

string headerList = string.Join(Environment.NewLine, headerStrings); headerListTextBox.Text = headerList; }}

Powy�szy kod zawiera jedno wyra�enie u�ywaj�ce s�owa kluczowego await, które zosta�owyró�nione pogrubion� czcionk�. S�owo to jest u�ywane w wyra�eniach, które mog� by�wykonywane przez d�u�szy czas, zanim zwróc� wynik; oznacza ono, �e dalsza cz��� metodynie powinna by� wykonana, dopóki operacja si� nie zako�czy. Wygl�da to zatem jak zwy-czajny, blokuj�cy kod synchroniczny, jednak ró�nica polega na tym, �e s�owo kluczowe awaitnie powoduje zablokowania w�tku.

Gdyby�my chcieli zablokowa� w�tek i poczeka� na wyniki, to nic nie stoi na przeszkodzie, byto zrobi�. Metoda SendAsync klasy HttpClient zwraca obiekt Task<HttpResponseMessage>,wi�c mo�na by zast�pi� wyra�enie z listingu 18.1 u�ywaj�ce s�owa kluczowego await wy-ra�eniem przedstawiony na listingu 18.2. Pobiera ono warto�� w�a�ciwo�ci Result zadania,a zgodnie z tym, czego dowiedzieli�my si� w rozdziale 17., je�li zadanie nie zosta�o zako�-czone, to próba odczytu tej w�a�ciwo�ci spowoduje zablokowanie w�tku do czasu wyge-nerowania wyników (b�d do momentu, gdy zadanie zako�czy si� niepowodzeniem, leczw takim przypadku wyra�enie zg�osi wyj�tek).

Listing 18.2. Blokuj�cy odpowiednik wyra�enia ze s�owem kluczowym await

HttpResponseMessage response = w.SendAsync(req, HttpCompletionOption.ResponseHeadersRead).Result;

Cho� wyra�enie await zastosowane w kodzie z listingu 18.1 robi co�, co jest pozornie po-dobne do powy�szej instrukcji, to jednak dzia�a zupe�nie inaczej. Je�li wynik zadania nie b�-dzie dost�pny od razu, to niezale�nie od tego, co sugeruje jego nazwa, s�owo kluczowe awaitsprawi, �e w�tek b�dzie czeka�. Zamiast tego spowoduje ono zako�czenie wykonywanej metody.Mo�na u�y� debugera, by przekona� si�, �e wywo�anie metody FetchAdnShowHeaders ko�czysi� natychmiast. Na przyk�ad: je�li wywo�amy t� metod� w procedurze obs�ugi klikni�cia przy-cisku, przedstawionej na listingu 18.3, to mo�emy ustawi� jeden punkt przerwania w wierszuzawieraj�cym wywo�anie Debug.WriteLine, oraz drugi w kodzie z listingu 18.1, w wierszuzawieraj�cym instrukcj� aktualizuj�c� warto�� w�a�ciwo�ci headerListTextBox.Text.

Poleć książkęKup książkę

660 � Rozdzia� 18. Asynchroniczne cechy j�zyka

Listing 18.3. Wywo�ywanie metody asynchronicznej

private void fetchHeadersButton_Click(object sender, RoutedEventArgs e){ FetchAndShowHeaders("http://helion.pl/"); Debug.WriteLine("Wywo�anie metody zosta�o zako�czone.");}

Je�li uruchomimy taki program w debugerze, przekonamy si�, �e najpierw zatrzymamy si�w punkcie przerwania umieszczonym w wierszu z listingu 18.3, a dopiero póniej w punkcieprzerwania z listingu 18.1. Innymi s�owy, fragment kodu z listingu 18.1 umieszczony za wy-ra�eniem ze s�owem kluczowym await zostaje wykonany po tym, gdy sterowanie zostanieprzekazane z metody do kodu, który j� wywo�a�. Najwyraniej kompilator jako� zmienia dal-sz� cz��� metody w taki sposób, aby zosta�a wykonana przy u�yciu wywo�ania zwrotnego,realizowanego po zako�czeniu operacji asynchronicznej.

Debuger Visual Studio stosuje ró�ne sztuczki podczas debugowania metod asynchro-nicznych, aby zapewni� nam mo�liwo�� analizowania ich krok po kroku jak normalnychmetod. Zazwyczaj jest to ca�kiem przydatne, jednak czasami ukrywa prawdziwy prze-bieg realizacji programu. Opisany powy�ej przyk�ad zosta� uwa�nie zaprojektowanyw taki sposób, aby przekre�li� starania Visual Studio i pokaza� faktyczny sposób re-alizacji kodu.

Warto zauwa�y�, �e kod z listingu 18.1 oczekuje, �e b�dzie wykonywany w w�tku obs�ugiinterfejsu u�ytkownika, gdy� pod koniec metody modyfikuje warto�� w�a�ciwo�ci Text polatekstowego. Metody asynchroniczne nie daj� gwarancji, �e powiadomienia o zako�czeniuoperacji b�d� generowane w tym samym w�tku, w którym operacja zosta�a rozpocz�ta —w wi�kszo�ci przypadków b�d� one generowane w innych w�tkach. Pomimo to kod z listingu18.1 dzia�a zgodnie z zamierzeniami. Oznacza to, �e s�owo kluczowe await nie tylko spowo-dowa�o przeniesienie po�owy kodu metody do wywo�ania zwrotnego, lecz tak�e zadba�o zanas o prawid�ow� obs�ug� powinowactwa do w�tku.

To wszystko wyranie pokazuje, �e u�ycie s�owa kluczowego await zmusza kompilator doprzeprowadzenia drastycznych zmian w naszym kodzie. W C# 4.0, chc�c u�y� tego asyn-chronicznego API, a nast�pnie zaktualizowa� interfejs u�ytkownika, konieczne by�o zastoso-wanie kodu podobnego do tego z listingu 18.4. Wykorzystuje on technik� opisan� w roz-dziale 17.: przygotowuje kontynuacj� dla zadania zwróconego przez metod� SendAsync,wykorzystuj�c przy tym obiekt TaskScheduler, by zapewni�, �e kod kontynuacji zostaniewykonany w w�tku obs�ugi interfejsu u�ytkownika.

Listing 18.4. Samodzielne tworzenie odpowiednika metody asynchronicznej

private void OldSchoolFetchHeaders(string url){ var w = new HttpClient(); var req = new HttpRequestMessage(HttpMethod.Head, url);

var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); w.SendAsync(req, HttpCompletionOption.ResponseHeadersRead) .ContinueWith(sendTask => { try { HttpResponseMessage response = sendTask.Result;

Poleć książkęKup książkę

Nowe s�owa kluczowe: async oraz await � 661

var headerStrings = from header in response.Headers select header.Key + ": " + string.Join(",", header.Value);

string headerList = string.Join(Environment.NewLine, headerStrings); headerListTextBox.Text = headerList; } finally { w.Dispose(); } }, uiScheduler);}

Jest to przyk�ad bardzo dobrego, bezpo�redniego wykorzystania TPL i zapewnia podobneefekty jak kod z listingu 18.1, cho� nie stanowi on dok�adnej reprezentacji sposobu, w jakikompilator C# przekszta�ca kod. Jak dowiesz si� z dalszej cz��ci rozdzia�u, s�owo kluczoweawait u�ywa wzorca, który jest obs�ugiwany przez klasy Task oraz Task<T>, lecz który ichnie wymaga. Dodatkowo gwarantuje ono wygenerowanie kodu, który obs�uguje wcze�niej-sze zako�czenie (czyli sytuacje, gdy zadanie zostanie wykonane, zanim b�dziemy gotowirozpocz�� oczekiwanie na jego zako�czenie) znacznie bardziej efektywnie ni� kod z listingu18.4. Jednak zanim poznasz wszelkie szczegó�y tego, co robi kompilator, warto si� dowie-dzie�, jakie problemy kompilator za nas rozwi�zuje — a to najlepiej zrobi�, pokazuj�c kod,który musieliby�my napisa� w C# 4.0.

Nasz aktualny przyk�ad jest ca�kiem prosty, gdy� realizuje tylko jedn� asynchroniczn� ope-racj�; jednak oprócz dwóch opisanych wcze�niej czynno�ci — czyli utworzenia jakiego� wy-wo�ania zwrotnego obs�uguj�cego zako�czenie oraz zapewnienia, �e zostanie ono wykonanew odpowiednim w�tku — musimy tak�e zadba� o odpowiedni� obs�ug� instrukcji using za-stosowanej w kodzie z listingu 18.1. Kod z listingu 18.4 nie mo�e u�ywa� instrukcji using,gdy� obiekt HttpClient chcemy zwolni� dopiero w momencie, gdy nie b�dzie ju� nam po-trzebny. Wywo�anie metody Dispose tu� przed zako�czeniem metody zewn�trznej nie zdaegzaminu, gdy� musimy mie� mo�liwo�� u�ycia obiektu w kodzie kontynuacji, a to zazwy-czaj nast�pi troch� po zako�czeniu metody. A zatem musimy utworzy� obiekt w jednej me-todzie (zewn�trznej) i zwolni� go w innej (wewn�trznej). A poniewa� sami wywo�ujemy przytym metod� Dispose, zatem sami musimy zadba� o obs�ug� wyj�tków. Dlatego te� konieczneby�o umieszczenie ca�ego kodu przeniesionego do metody zwrotnej w bloku try i wywo�aniemetody Dispose w bloku finally. (W rzeczywisto�ci zastosowane rozwi�zanie nie jest kom-pletne i niezawodne — gdyby konstruktor klasy HttpRequestMessage lub metoda pobieraj�-ca mechanizm szeregowania zada�, co jest raczej ma�o prawdopodobne, zg�osi�y wyj�tek, tou�ywany obiekt HttpClient nie zosta�by prawid�owo zwolniony. Innymi s�owy, nasz kodobs�uguje jedynie t� sytuacj�, gdy problemy pojawi� si� w samej operacji sieciowej).

Kod z listingu 18.4 u�ywa mechanizmu szeregowania zada�, by wykona� kontynuacj� przywykorzystaniu obiektu SynchronizationContext, aktywnego w momencie rozpoczynaniaoperacji. Dzi�ki temu zapewniamy, �e wywo�anie zwrotne zostanie wykonane w w�tkuumo�liwiaj�cym aktualizacj� interfejsu u�ytkownika. Cho� to w zupe�no�ci wystarcza do za-pewnienia poprawnego dzia�ania naszego przyk�adu, to jednak s�owo kluczowe await robidla nas nieco wi�cej.

Poleć książkęKup książkę

662 � Rozdzia� 18. Asynchroniczne cechy j�zyka

Konteksty wykonania i synchronizacjiJe�li realizacja kodu dociera do wyra�enia zawieraj�cego s�owo kluczowe await oraz opera-cj�, której wykonanie nie zako�czy�o si� od razu, to wygenerowany przez kompilator kodreprezentuj�cy await zapewni pobranie aktualnego kontekstu wykonania. (Mo�e si� zdarzy�,�e nie b�dzie to wymaga�o wielkiego zachodu — je�li nie jest to pierwszy blok await w danejmetodzie oraz je�li u�ywany kontekst nie zosta� zmieniony, to b�dzie on ju� pobrany). Po za-ko�czeniu operacji asynchronicznej dalsza cz��� kodu metody zostanie wykonana przy wy-korzystaniu kontekstu wykonania2.

Zgodnie z informacjami podanymi w rozdziale 17., kontekst wykonania obs�uguje pewnekontekstowe informacje o bezpiecze�stwie oraz lokalny stan w�tku, które musz� by� przeka-zywane, gdy jedna metoda wywo�uje drug� (i to nawet je�li robi to bezpo�rednio). Niemniejjednak istnieje jeszcze inny rodzaj kontekstu, który mo�e nas interesowa�, a zw�aszcza je�litworzymy kod obs�ugi interfejsu u�ytkownika; chodzi o kontekst synchronizacji.

Cho� wszystkie wyra�enia await pobieraj� kontekst wykonania, to decyzja o tym, czy wrazz nim nale�y pobra� tak�e kontekst synchronizacji, zale�y od typu, na który oczekujemy. Je�lioczekujemy na dan� typu Task, to domy�lnie kontekst synchronizacji tak�e zostanie pobrany.Zadania nie s� jedynymi obiektami, na jakie mo�na oczekiwa�, informacje dotycz�ce sposobu,w jaki mo�na dostosowa� typy do obs�ugi s�owa kluczowego await, zosta�y podane w dalszejcz��ci rozdzia�u, w punkcie pt. „Wzorzec s�owa kluczowego await”.

Czasami mog� si� zdarzy� sytuacje, w których nie b�dziemy chcieli u�ywa� kontekstu syn-chronizacji. Je�li chcemy wykona� jak�� operacj� asynchroniczn�, rozpoczynaj�c j� w w�tku ob-s�ugi interfejsu u�ytkownika, a jednocze�nie nie ma konieczno�ci dalszego pozostawania w tymw�tku, to planowanie wykonania wszystkich kontynuacji przy u�yciu kontekstu synchronizacjib�dzie jedynie niepotrzebnym obci��eniem. Je�li operacja asynchroniczna jest reprezentowanaprzez obiekt Task lub Task<T>, to u�ywaj�c zdefiniowanej w tych klasach metody ConfigureAwaitmo�emy zadeklarowa�, �e nie chcemy u�ywa� kontekstu synchronizacji. W takim przypadkuzwracana jest nieznacznie zmieniona reprezentacja operacji asynchronicznej, a je�li jej u�yjemyw wyra�eniu await zamiast oryginalnego zadania, to bie��cy kontekst synchronizacji zostaniezignorowany (oczywi�cie o ile w ogóle b�dzie dost�pny). (Nie mo�na natomiast zrezygnowa�z wykorzystania kontekstu wykonania). Listing 18.5 pokazuje, jak mo�na korzysta� z metodyConfigureAwait.

Listing 18.5. Stosowanie metody ConfigureAwait

private async void OnFetchButtonClick(object sender, RoutedEventArgs e){ using (var w = new HttpClient()) using (Stream f = File.Create(fileTextBox.Text)) { Task<Stream> getStreamTask = w.GetStreamAsync(urlTextBox.Text); Stream getStream = await getStreamTask.ConfigureAwait(false);

Task copyTask = getStream.CopyToAsync(f); await copyTask.ConfigureAwait(false); }}

2 Okazuje si�, �e to samo dzieje si� w przyk�adzie z listingu 18.4, gdy� TPL pobiera kontekst wykonywania za nas.

Poleć książkęKup książkę

Nowe s�owa kluczowe: async oraz await � 663

Powy�szy kod reprezentuje procedur� obs�ugi klikni�� przycisku, dlatego te� jest wykony-wany w w�tku obs�ugi interfejsu u�ytkownika. Pobiera on warto�ci w�a�ciwo�ci Text kilkupól tekstowych, a nast�pnie wykonuje pewn� operacj� asynchroniczn� — pobiera zawarto��adresu URL i kopiuje pobrane dane do pliku. Po pobraniu zawarto�ci dwóch w�a�ciwo�ciText powy�szy kod nie u�ywa ju� �adnych elementów interfejsu u�ytkownika, a zatem je�liwykonanie operacji asynchronicznej troch� zajmuje, to nie b�dzie mia�o �adnego znaczenia,�e jej pozosta�a cz��� zostanie wykonana w innym w�tku. Poprzez przekazanie warto�ci falsew wywo�aniu metody ConfigureAwait oraz poczekanie na zwrócon� przez nie warto�� in-formujemy TPL, �e do zako�czenia operacji mo�e zosta� wykorzystany dowolny w�tek, przyczym w tym przypadku b�dzie to najprawdopodobniej jeden z w�tków dost�pnych w puli.Dzi�ki temu operacja b�dzie mog�a zosta� wykonana szybciej i bardziej efektywnie, gdy� nieb�dzie musia�a bez potrzeby korzysta� z w�tku obs�ugi interfejsu u�ytkownika po ka�dyms�owie kluczowym await.

Kod przedstawiony na listingu 18.1 zawiera tylko jedno wyra�enie ze s�owem kluczowymawait, lecz nawet ten kod trudno jest odtworzy�, wykorzystuj�c klasyczny model progra-mowania z u�yciem TPL. Przyk�ad z listingu 18.5 zawiera dwa takie wyra�enia, a odtworzeniesposobu jego dzia�ania bez pomocy await wymaga�oby u�ycia dosy� rozbudowanego kodu,gdy� wyj�tki mog�yby by� zg�aszane przed pierwszym wyra�eniem await, po drugim wyra-�eniu oraz pomi�dzy nimi; oprócz tego w ka�dym z tych przypadków (jak równie� w sytuacji,gdy nie zosta�y zg�oszone �adne wyj�tki) musieliby�my zadba� o wywo�anie metody Disposew celu zwolnienia u�ywanych obiektów HttpClient oraz Stream. Niemniej jednak sytuacjastaje si� znacz�co bardziej skomplikowana, kiedy w gr� zaczyna dodatkowo wchodzi� ste-rowanie przep�ywem.

Wykonywanie wielu operacji i p�tliZa�ó�my, �e zamiast pobiera� nag�ówki lub kopiowa� zawarto�� odpowiedzi HTTP do pliku,chcemy t� zawarto�� przetworzy�. Je�li jest ona bardzo du�a, to pobranie jej jest operacj�,która mo�e wymaga� wykonania wielu czasoch�onnych kroków. Przyk�ad przedstawiony nalistingu 18.6 pobiera ca�� stron� WWW wiersz po wierszu.

Listing 18.6. Wykonywanie wielu operacji asynchronicznych

private async void FetchAndShowBody(string url){ using (var w = new HttpClient()) { Stream body = await w.GetStreamAsync(url); using (var bodyTextReader = new StreamReader(body)) { while (!bodyTextReader.EndOfStream) { string line = await bodyTextReader.ReadLineAsync(); headerListTextBox.AppendText(line); headerListTextBox.AppendText(Environment.NewLine); await Task.Delay(TimeSpan.FromMilliseconds(10)); } } }}

Poleć książkęKup książkę

664 � Rozdzia� 18. Asynchroniczne cechy j�zyka

W powy�szym kodzie zosta�y u�yte trzy wyra�enia await. Pierwsze z nich powoduje wyko-nanie ��dania HTTP GET, a operacja ta zako�czy si� w momencie odebrania pierwszej cz��ciodpowiedzi, cho� w tym momencie odpowied mo�e jeszcze nie by� kompletna — mo�e za-wiera� jeszcze kilka megabajtów danych, które trzeba b�dzie jeszcze przekaza�. Powy�szyprzyk�ad zak�ada, �e zawarto�� odpowiedzi b�dzie tekstowa, dlatego te� przekazuje zwróco-ny obiekt Stream jako argument wywo�ania konstruktora strumienia StreamReader, któryudost�pnia bajty stanowi�ce zawarto�� strumienia jako tekst3. Nast�pnie przyk�ad u�ywametody ReadLineAsync, by wiersz po wierszu odczytywa� zawarto�� odpowiedzi. Poniewa�dane s� przesy�ane fragmentami, zatem odczytanie pierwszego wiersza tekstu mo�e troch�zaj��, jednak kilka kolejnych wywo�a� metody zostanie zapewne wykonanych momentalnie,gdy� ka�dy odebrany pakiet sieciowy zazwyczaj zawiera wi�cej wierszy. Je�li jednak naszkod mo�e odczytywa� dane szybciej, ni� s� przesy�ane sieci�, to w ko�cu odczyta wszystkiewiersze, które by�y dost�pne w pierwszym pakiecie, i pewnie minie troch� czasu, zanim po-jawi� si� kolejne. Dlatego te� wywo�ania metody ReadLineAsync b�d� zwraca�y zarówno za-dania, których wykonanie zajmuje wi�cej czasu, jak i takie, które zostan� zako�czone b�y-skawicznie. Trzeci� operacj� asynchroniczn� jest wywo�anie metody Task.Delay. W powy�szymprzyk�adzie zosta�a ona u�yta po to, by nieco zwolni� odczyt danych i aby kolejne wierszetekstu pojawia�y si� w interfejsie u�ytkownika stopniowo. Metoda Task.Delay zwraca obiektTask, który zostanie zako�czony po up�ywie okre�lonego czasu; stanowi ona zatem asynchro-niczny odpowiednik metody Thread.Sleep. (Metoda Thread.Sleep blokuje w�tek, w którymzosta�a wywo�ana, natomiast wyra�enie await Task.Delay wprowadza opónienie bez blo-kowania w�tku).

W powy�szym przyk�adzie ka�de z wyra�e� await zosta�o umieszczone w odr�bnejinstrukcji; takie rozwi�zanie nie jest jednak konieczne. Nic nie stoi na przeszkodzie, byu�y� wyra�enia o nast�puj�cej postaci: (await t1) + (await t2). (W razie potrzebymo�na pomin�� nawiasy, gdy� operator await ma wy�szy priorytet ni� operator do-dawania, ja jednak preferuj� wizualny porz�dek i hierarchi�, jak� one zapewniaj�).

Nie przedstawi� tu pe�nego odpowiednika kodu z listingu 18.6, który nale�a�oby napisa�w j�zyku C# 4.0, gdy� jest on zbyt du�y. Ogranicz� si� jedynie do przedstawienia kilku pro-blemów. Przede wszystkim w powy�szym kodzie u�ywamy p�tli, wewn�trz której zosta�yumieszczone dwa wyra�enia await. Odtworzenie analogicznego kodu z u�yciem obiektówTask i wywo�a� zwrotnych oznacza�oby konieczno�� stworzenia w�asnego odpowiednikap�tli, gdy� jej zawarto�� musi zosta� rozdzielona na trzy metody: pierwsza z nich rozpoczy-na�aby dzia�anie p�tli (by�aby ona metod� zagnie�d�on�, dzia�aj�c� jako kontynuacja metodyGetStreamAsync), a pozosta�e dwie by�yby wywo�aniami zwrotnymi obs�uguj�cymi zako�-czenie operacji ReadLineAsync oraz Task.Delay. Takie rozwi�zanie mo�na by zaimplemen-towa�, tworz�c metod� zagnie�d�on� s�u��c� do rozpoczynania kolejnych iteracji i wywo�uj�cj� z dwóch miejsc: w miejscu, w którym chcemy rozpocz�� dzia�anie p�tli, oraz w kontynu-acji zadania Task.Delay w celu rozpocz�cia kolejnej iteracji p�tli. Ta technika zosta�a zapre-zentowana na listingu 18.7, cho� przedstawia on tylko jeden aspekt dzia�a�, które wykonujeza nas kompilator — nie jest on kompletnym odpowiednikiem kodu z listingu 18.6.

3 Precyzyjnie rzecz ujmuj�c, powinni�my sprawdzi� nag�ówki odpowiedzi HTTP, by okre�li� u�yty sposób ko-

dowania i w odpowiedni sposób skonfigurowa� obiekt StreamReader. Jednak w tym przyk�adzie pozwalamy,by obiekt strumienia sam okre�li� sposób kodowania, co na potrzeby przyk�adu powinno dzia�a� wystarcza-j�co dobrze.

Poleć książkęKup książkę

Nowe s�owa kluczowe: async oraz await � 665

Listing 18.7. Niekompletna samodzielna implementacja p�tli asynchronicznej

private void IncompleteOldSchoolFetchAndShowBody(string url){ var w = new HttpClient(); var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); w.GetStreamAsync(url).ContinueWith(getStreamTask => { Stream body = getStreamTask.Result; var bodyTextReader = new StreamReader(body);

Action startNextIteration = null; startNextIteration = () => { if (!bodyTextReader.EndOfStream) { bodyTextReader.ReadLineAsync() .ContinueWith(readLineTask => { string line = readLineTask.Result;

headerListTextBox.AppendText(line); headerListTextBox.AppendText(Environment.NewLine);

Task.Delay(TimeSpan.FromMilliseconds(10)) .ContinueWith(delayTask => startNextIteration(), uiScheduler); }, uiScheduler); } }; startNextIteration(); }, uiScheduler);}

Ten kod dzia�a jako tako, jednak nawet nie podejmuje próby zwolnienia któregokolwiekz u�ywanych zasobów. Wyst�puje w nim kilka miejsc, w których potencjalnie mo�e doj�� doawarii, dlatego nie wystarczy umie�� w kodzie jednej instrukcji using lub pary blokówtry/finally, aby zabezpieczy� dzia�anie kodu. A nawet bez tego dodatkowego utrudnieniadzia�anie kodu ledwie mo�na zrozumie� — wcale nie jest oczywiste, �e próbuje on wykona�te same operacje co przyk�ad z listingu 18.6. Po dodaniu odpowiedniej obs�ugi b��dów tenkod by�by ca�kowicie niezrozumia�y. W praktyce zapewne �atwiej by by�o zastosowa� ca�ko-wicie inne rozwi�zanie, polegaj�ce na napisaniu klasy implementuj�cej maszyn� stanów i na tejpodstawie okre�laj�cej czynno�ci, jakie ma wykonywa�. Takie rozwi�zanie zapewne u�atwi-�oby napisanie prawid�owo dzia�aj�cego kodu, jednak wcale nie u�atwi�oby osobie analizuj�-cej kod zorientowa� si�, �e to, na co patrzy, jest w rzeczywisto�ci niewiele wi�cej ni� p�tl�.

Nic zatem dziwnego, �e tak wielu programistów preferuje stosowanie rozwi�za� synchro-nicznych. Jednak C# 5.0 pozwala nam pisa� kod asynchroniczny, który ma niemal tak� sam�struktur� co jego synchroniczny odpowiednik, bezbole�nie zapewniaj�c nam przy tym wszyst-kie korzy�ci zwi�zane z wi�ksz� wydajno�ci� dzia�ania i sprawnym reagowaniem na poczy-nania u�ytkownika. Najpro�ciej rzecz ujmuj�c, w�a�nie te korzy�ci zapewniaj� nam s�owakluczowe async oraz await.

Ka�da metoda wykorzystuj�ca s�owo kluczowe await sama b�dzie wykonywana przez jaki�okre�lony czas. A zatem oprócz korzystania z asynchronicznych API mo�emy uzna� za sto-sowne, by stworzy� dla niej jak�� asynchroniczn� reprezentacj�. Oba przedstawione s�owakluczowe pomagaj� nam to zrobi�.

Poleć książkęKup książkę

666 � Rozdzia� 18. Asynchroniczne cechy j�zyka

Zwracanie obiektu TaskKompilator C# narzuca pewne ograniczenia na typy warto�ci wynikowych, które mog� zwra-ca� metody oznaczone modyfikatorem async. Jak ju� si� dowiedzieli�my, mog� one zwraca�void, jednak oprócz tego istniej� dwie inne mo�liwo�ci: mo�na zwraca� instancj� typu Taskb�d typu Task<T>, gdzie T jest dowolnym typem. Dzi�ki temu kod wywo�uj�cy nasz� asyn-chroniczn� metod� mo�e uzyskiwa� informacje o statusie wykonywanych przez ni� prac,a oprócz tego dysponuje mo�liwo�ci� do��czania do niej kontynuacji, a tak�e pobierania wy-niku (je�li zwracany jest obiekt Task<T>). Oznacza to oczywi�cie, �e je�li nasza metoda jestwywo�ywana wewn�trz innej metody asynchronicznej (oznaczonej modyfikatorem async), tojej wynik b�dzie mo�na pobra�, u�ywaj�c s�owa kluczowego await.

Zwracanie zada� jest zazwyczaj bardziej preferowanym rozwi�zaniem ni� zwracanie typuvoid, gdy� w tym drugim przypadku kod wywo�uj�cy nie dysponuje tak naprawd� mo�li-wo�ci� okre�lenia, kiedy metoda zosta�a zako�czona oraz czy nale�y zg�osi� wyj�tek. (Metodyasynchroniczne mog� dzia�a� nawet po przekazaniu sterowania do kodu wywo�uj�cego —w ko�cu w�a�nie o to w nich chodzi — a zatem w momencie, kiedy nasza metoda zg�osi wy-j�tek, metody, która j� wywo�a�a, mo�e ju� w ogóle nie by� na stosie). Zwracaj�c obiekt Tasklub Task<T>, zapewniamy kompilatorowi mo�liwo�� udost�pniania wyj�tków oraz w raziepotrzeby zwracania wyników.

Oprócz ograniczenia nakazuj�cego stosowanie modyfikatora async wy��cznie w me-todach zwracaj�cych wynik typu void, Task b�d Task<T> nie mo�na go tak�e u�y-wa� w metodzie stanowi�cej punkt wej�cia do programu, czyli w metodzie Main.

Zwrócenie zadania jest tak trywialnie proste, �e nie ma �adnego powodu, by tego nie robi�.Aby zmodyfikowa� metod� z listingu 18.6 tak, by zwraca�a zadanie, trzeba wprowadzi� tylkojedn� zmian�. Wystarczy zmieni� typ warto�ci wynikowej z void na Task, jak pokazuje li-sting 18.8 — reszta kodu mo�e pozosta� bez zmian.

Listing 18.8. Zwracanie zadania

private async Task FetchAndShowBody(string url)... jak wcze�niej

Kompilator automatycznie generuje kod wymagany do utworzenia obiektu Task i w zale�no�ciod tego, czy metoda zwróci wynik, czy zg�osi wyj�tek, ustawia jego status na zako�czony lubzako�czony niepowodzeniem. Tak�e zwracanie wyniku z zadania jest bardzo �atwe. Wystarczyu�y� typu Task<T>, a w kodzie metody umie�ci� instrukcj� return, jak gdyby zwraca�a onawarto�� typu T. Przyk�ad takiej metody zosta� przedstawiony na listingu 18.9.

Listing 18.9. Zwracanie zadania Task<T>

public static async Task<string> GetServerHeader(string url){ using (var w = new HttpClient()) { var request = new HttpRequestMessage(HttpMethod.Head, url); HttpResponseMessage response = await w.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);

string result = null; IEnumerable<string> values;

Poleć książkęKup książkę

Nowe s�owa kluczowe: async oraz await � 667

if (response.Headers.TryGetValues("Server", out values)) { result = values.FirstOrDefault(); } return result; }}

Powy�sza metoda asynchronicznie pobiera nag�ówki HTTP, tak samo jak przyk�ad z listingu18.1, jednak zamiast je wy�wietla�, pobiera i zwraca warto�� pierwszego nag�ówka Server:.Jak wida�, instrukcja return zwraca �a�cuch znaków, cho� zadeklarowanym typem warto�ciwynikowej metody jest Task<string>. Kompilator generuje kod, który ko�czy wykonywaniezadania i u�ywa zwróconego �a�cucha znaków jako wyniku. W przypadku u�ycia typu Tasklub Task<T> wygenerowany kod zwraca zadanie bardzo podobne do tego, które mo�na uzy-ska�, u�ywaj�c klasy TaskCompletionSource<T>, opisanej w rozdziale 17.

Cho� s�owo kluczowe await mo�e operowa� na dowolnej metodzie asynchronicznejpasuj�cej do okre�lonego wzorca (opisanego w dalszej cz��ci rozdzia�u), to jednakC# nie zapewnia równie wielkiej elastyczno�ci, je�li chodzi o mo�liwo�ci implementacjimetod asynchronicznych. Jedynymi typami, jakie mog� zwraca� metody z modyfi-katorem async s�: Task, Task<T> oraz void.

Jednak zwracanie zada� ma pewn� wad�. Otó� kod wywo�uj�cy nie ma obowi�zku robi� cze-gokolwiek z tak zwróconym zadaniem, zatem nasza metoda mo�e by� równie �atwa w u�y-ciu co metoda zwracaj�ca typ void, a jednocze�nie ma t� zalet�, �e udost�pnia zadanie, którekod wywo�uj�cy mo�e wykorzysta�. Chyba jedynym powodem zwracania typu void mog�obyby� narzucenie przez kod zewn�trzny konieczno�ci u�ycia metody o okre�lonej sygnaturze. Naprzyk�ad wi�kszo�� procedur obs�ugi zdarze� musi u�ywa� typu void. Jednak oprócz sytuacji,gdy jeste�my do tego zmuszeni, stosowanie w metodach asynchronicznych typu void nie jestzalecane.

Stosowanie async w metodach zagnie�d�onychW przyk�adach przedstawionych do tej pory u�ywali�my s�owa kluczowego async tylkow zwyczajnych metodach. Jednak mo�na je tak�e stosowa� w metodach zagnie�d�onych —zarówno metodach anonimowych, jak i w wyra�eniach lambda. Na przyk�ad: je�li piszemyprogram, który tworzy elementy interfejsu u�ytkownika programowo, wygodnym rozwi�za-niem mo�e by� do��czanie procedur obs�ugi zdarze� w formie wyra�e� lambda, mo�emy si�przy tym zdecydowa�, by niektóre z nich zosta�y zaimplementowane jako asynchroniczne,jak pokazano na listingu 18.10.

Listing 18.10. Asynchroniczne wyra�enie lambda

okButton.Click += async (s, e) =>{ using (var w = new HttpClient()) { infoTextBlock.Text = await w.GetStringAsync(uriTextBox.Text); }};

Sk�adnia asynchronicznej metody anonimowej jest bardzo podobna, jak wida� w przyk�adzieprzedstawionym na listingu 18.11.

Poleć książkęKup książkę

668 � Rozdzia� 18. Asynchroniczne cechy j�zyka

Listing 18.11. Asynchroniczna metoda anonimowa

okButton.Click += async delegate (object s, RoutedEventArgs e){ using (var w = new HttpClient()) { infoTextBlock.Text = await w.GetStringAsync(uriTextBox.Text); }};

eby wszystko by�o jasne — powy�szy kod nie ma nic wspólnego z asynchronicznym wy-wo�ywaniem delegatów, czyli technik�, o której wspomina�em w rozdziale 9., s�u��c� do ko-rzystania z puli w�tków i popularn�, zanim metody anonimowe i TPL sta�y si� lepsz� alter-natyw�. Asynchroniczne wywo�ywanie delegatów jest rozwi�zaniem, na które mo�e si�zdecydowa� kod korzystaj�cy z delegatu — jednak w takim przypadku asynchroniczno�� niejest ani cech� delegatu, ani metody, która go wywo�uje. Jest to jedynie rozwi�zanie zastoso-wane przez kod u�ywaj�cy delegatu. Jednak zastosowanie modyfikatora async w metodzieanonimowej lub wyra�eniu lambda pozwala nam na korzystanie wewn�trz nich ze s�owakluczowego await, zmieniaj�c w ten sposób kod metody generowany przez kompilator.

Wzorzec s�owa kluczowego awaitWi�kszo�� metod asynchronicznych, których b�dziemy u�ywa� wraz ze s�owem kluczowymawait, zwraca jakie� zadania TPL. Niemniej jednak C# wcale tego nie wymaga. Kompilator po-zwala na stosowanie ze s�owem kluczowym await dowolnych obiektów, implementuj�cychokre�lony wzorzec. Cho� klasy Task i Task<T>, obs�uguj� ten wzorzec, to jednak sposób jegodzia�ania oznacza, �e kompilator b�dzie u�ywa� zada� w nieco inny sposób, ni� to robimy, ko-rzystaj�c z biblioteki TPL bezpo�rednio — po cz��ci w�a�nie z tego powodu napisa�em wcze-�niej, �e kod wykorzystuj�cy zadania i stanowi�cy odpowiednik kodu u�ywaj�cego s�owakluczowego await nie stanowi dok�adnego odpowiednika kodu generowanego przez kom-pilator. W tym podrozdziale wyja�ni�, jak kompilator u�ywa zada� oraz innych typów, któremog� by� stosowane wraz ze s�owem kluczowym await.

W dalszej cz��ci tego podrozdzia�u stworzymy w�asn� implementacj� wzorca s�owa kluczo-wego await, aby pokaza�, czego oczekuje kompilator. (Tak si� sk�ada, �e Visual Basic rozpo-znaje i obs�uguje dok�adnie ten sam wzorzec). Listing 18.12 przedstawia metod� asynchro-niczn� o nazwie UseCustomAsync, która korzysta z naszej asynchronicznej implementacji.Metod ta zapisuje wynik wyra�enia await w zmiennej typu string, a zatem najwyraniejoczekuje, �e nasza asynchroniczna operacja zwróci �a�cuch znaków. Wywo�uje ona metod�CustomAsync, zwracaj�c� t� implementacj� wzorca. Jak wida�, nie jest to wcale Task<string>.

Listing 18.12. Wywo�ywanie niestandardowej implementacji typu wspó�pracuj�cego z await

static async Task UseCustomAsync(){ string result = await CustomAsync(); Console.WriteLine(result);}

public static MyAwaitableType CustomAsync(){ return new MyAwaitableType();}

Poleć książkęKup książkę

Wzorzec s�owa kluczowego await � 669

Kompilator oczekuje, �e typ operandu s�owa kluczowego await b�dzie udost�pnia� metod�o nazwie GetAwaiter. Mo�e to by� zwyczajna metoda sk�adowa b�d metoda rozszerzenia.(A zatem definiuj�c odpowiedni� metod� rozszerzenia, mo�na sprawi�, �e s�owo kluczoweawait b�dzie wspó�pracowa�o z typem, który sam z siebie go nie obs�uguje). Metoda ta musizwraca� obiekt lub warto�� zapewniaj�c� trzy mo�liwo�ci.

Przede wszystkim musi udost�pnia� w�a�ciwo�� typu bool o nazwie IsCompleted, któr� kodwygenerowany przez kompilator do obs�ugi s�owa kluczowego await b�dzie sprawdza�w celu okre�lenia, czy operacja ju� si� zako�czy�a. W przypadku gdy operacja zosta�a ju� za-ko�czona, przygotowywanie wywo�ania zwrotnego by�oby strat� czasu. A zatem kod obs�u-guj�cy s�owo kluczowe await nie b�dzie tworzy� niepotrzebnego delegatu, je�li w�a�ciwo��IsCompleted zwróci warto�� true, a zamiast tego od razu wykona dalsz� cz��� metody.

Oprócz tego kompilator wymaga jakiego� sposobu pobrania wyniku, kiedy operacja zostanieju� zako�czona. Dlatego te� obiekt lub warto�� zwracana przez metod� GetAwaiter musi udo-st�pnia� metod� GetResult. Typ wyniku zwracanego przez t� metod� definiuje typ wynikuoperacji — a zatem b�dzie to typ ca�ego wyra�enia await. W przyk�adzie z listingu 18.12 wynikwyra�enia await jest zapisywany w zmiennej typu string, a zatem wynik zwracany przezmetod� GetResult obiektu zwróconego przez metod� GetAwaiter klasy MyAwaitableType musiby� typu string (b�d jakiego� innego typu, który niejawnie mo�na skonwertowa� na string).

I w ko�cu ostatni� mo�liwo�ci�, której potrzebuje kompilator, jest dostarczenie metody zwrotnej.Je�li w�a�ciwo�� IsCompleted zwróci warto�� false, informuj�c tym samym, �e operacja jesz-cze si� nie zako�czy�a, to kod wygenerowany przez kompilator do obs�ugi s�owa kluczowegoawait wygeneruje delegat, który wykona pozosta�� cz��� kodu metody. (Przypomina to niecoprzekazywanie delegatu do metody ContinueWith zadania). Kompilator wymaga w tym celu niemetody, lecz ca�ego interfejsu. Musimy zatem zaimplementowa� interfejs INotifyCompletion,lecz oprócz niego istnieje jeszcze jeden interfejs, ICiriticalNotifyCompletion, którego im-plementacja jest zalecana, o ile tylko jest to mo�liwe. Oba te interfejsy s� podobne: ka�dy z nichdefiniuje jedn� metod� (OnCompleted oraz UnsafeOnCompleted), która pobiera jeden delegattypu Action, który klasa implementuj�ca interfejs musi wywo�a� w momencie zako�czeniaoperacji. Oba te interfejsy oraz ich metody ró�ni� si� tym, �e pierwszy z nich wymaga od klasyimplementuj�cej przekazania kontekstu wykonania do metody docelowej, natomiast w przy-padku drugiego interfejsu nie jest to konieczne. Kompilator C# zawsze przekazuje kontekstwykonania za nas, a zatem je�li metoda UnsafeOnCompleted b�dzie dost�pna, to kompilatorwywo�a j�, by unikn�� dwukrotnego przekazywania kontekstu. (Je�li kompilator wywo�ametod� OnCompleted, to tak�e obiekt zwrócony przez metod� GetAwaiter przeka�e kontekstwykonania). Niemniej jednak skorzystanie z metody UnsafeOnCompleted mo�e by� niemo�-liwe ze wzgl�dów bezpiecze�stwa. Poniewa� metoda ta nie przekazuje kontekstu wykona-nia, zatem kod niedysponuj�cy pe�nym zaufaniem nie mo�e jej wywo�ywa�, gdy� pozwala-�oby to na omini�cie pewnych mechanizmów zabezpiecze�. Metoda UnsafeOnCompleted jestoznaczona atrybutem SecurityCriticalAttribute, co oznacza, �e mo�e j� wywo�ywa� tylkokod dysponuj�cy pe�nym zaufaniem. A zatem metoda OnCompleted jest potrzebna, by tak�ekod, który nie dysponuje pe�nym zaufaniem, móg� korzysta� z obiektu zwracanego przezmetod� GetAwaiter.

Listing 18.13 przedstawia minimaln�, nadaj�c� si� do u�ycia implementacj� wzorca s�owakluczowego await. Przedstawiony kod jest jednak bardzo uproszczony, gdy� zawsze ko�czysi� synchronicznie, a zatem jego metoda OnCompleted nic nie robi. W rzeczywisto�ci, je�li na-sza przyk�adowa klasa zostanie u�yta w taki sposób, w jaki wzorzec await ma by� u�ywany,

Poleć książkęKup książkę

670 � Rozdzia� 18. Asynchroniczne cechy j�zyka

to jej metoda OnCompleted w ogóle nie zostanie wywo�ana — w�a�nie dlatego zg�asza wyj�tek.Niemniej jednak cho� przedstawiony przyk�ad jest nierealistycznie prosty, to jednak ca�kiemdobrze pokazuje sposób dzia�ania s�owa kluczowego await.

Listing 18.13. Wyj�tkowo prosta implementacja wzorca s�owa kluczowego await

public class MyAwaitableType{ public MinimalAwaiter GetAwaiter() { return new MinimalAwaiter(); }

public class MinimalAwaiter : INotifyCompletion { public bool IsCompleted { get { return true; } }

public string GetResult() { return "Oto wynik!"; }

public void OnCompleted(Action continuation) { throw new NotImplementedException(); } }}

Po przedstawieniu tego kodu mo�emy ju� zobaczy�, jak dzia�a przyk�ad z listingu 18.12.Wywo�a on metod� GetAwaiter instancji typu MyAwaitableType zwróconej przez metod�CustomAsync. Nast�pnie sprawdzi warto�� w�a�ciwo�ci IsCompleted uzyskanego obiektu i je�lioka�e si�, �e ma ona warto�� true (co te� si� stanie), to bezzw�ocznie zostanie wykonana resztametody. Kompilator nie wie o tym, �e w�a�ciwo�� IsCompleted zawsze ma warto�� true, dlategote� wygeneruje kod pozwalaj�cy na prawid�owe obs�u�enie przypadku, gdyby w�a�ciwo�� taprzyj��a warto�� false. Kod ten utworzy delegat, który kiedy zostanie wywo�any, wykona po-zosta�� cz��� metody, po czym przeka�e ten delegat do metody OnComplete. (Nasz przyk�adowykod nie implementuje metody UnsafeOnCompleted, zatem zostanie u�yta metoda OnCompleted).Kod, który wykonuje te wszystkie operacje, zosta� przedstawiony na listingu 18.14.

Listing 18.14. Bardzo ogólne przybli�enie dzia�ania s�owa kluczowego await

static void ManualUseCustomAsync(){ var awaiter = CustomAsync().GetAwaiter(); if (awaiter.IsCompleted) { TheRest(awaiter); } else { awaiter.OnCompleted(() => TheRest(awaiter)); }}

private static void TheRest(MyAwaitableType.MinimalAwaiter awaiter){ string result = awaiter.GetResult(); Console.WriteLine(result);}

Poleć książkęKup książkę

Wzorzec s�owa kluczowego await � 671

Metoda zosta�a podzielona na dwie cz��ci, gdy� kompilator unika tworzenia delegatu, je�liw�a�ciwo�� IsCompleted przyjmie warto�� true, a my chcemy, by nasz kod dzia�a� podob-nie. Niemniej jednak nie jest to dok�adnie to samo, co robi kompilator C# — potrafi on tak�eunikn�� tworzenia dodatkowych metod dla poszczególnych instrukcji await, cho� oznaczato, �e generowany przez niego kod jest znacz�co bardziej skomplikowany. W rzeczywisto�ciw przypadku metod zawieraj�cych tylko jedno s�owo kluczowe await generowany przezkompilator narzut jest znacz�co wi�kszy do tego z listingu 18.14. Niemniej jednak wraz zewzrostem liczby u�ywanych wyra�e� await ta dodatkowa z�o�ono�� zaczyna si� op�aca�,gdy� kompilator nie musi dodawa� kolejnych metod. Listing 18.15 przedstawia kod, któryw nieco wi�kszym stopniu przypomina to, co faktycznie generuje kompilator.

Listing 18.15. Nieco lepsze przybli�enie sposobu dzia�ania s�owa kluczowego await

private class ManualUseCustomAsyncState{ private int state; private MyAwaitableType.MinimalAwaiter awaiter;

public void MoveNext() { if (state == 0) { awaiter = CustomAsync().GetAwaiter(); if (!awaiter.IsCompleted) { state = 1; awaiter.OnCompleted(MoveNext); return; } } string result = awaiter.GetResult(); Console.WriteLine(result); }}

static void ManualUseCustomAsync(){ var s = new ManualUseCustomAsyncState(); s.MoveNext();}

Powy�szy kod i tak jest prostszy do tego, który kompilator generuje w rzeczywisto�ci, jednakpokazuje ogóln� strategi� dzia�ania: kompilator generuje zagnie�d�ony typ dzia�aj�cy jakomaszyna stanów. Definiuje on pole (state) przechowuj�ce informacje o tym, do któregomiejsca dotar�a realizacja metody, oraz pola reprezentuj�ce zmienne lokalne metody. (W po-wy�szym przyk�adzie jest to jedynie zmienna awaiter). Kiedy operacja asynchroniczna niezostaje zablokowana (czyli gdy w�a�ciwo�� IsCompleted natychmiast zwróci warto�� true),od razu mo�na wykona� nast�pn� cz��� kodu. Jednak w przypadku, gdy wykonanie operacjiwymaga nieco czasu, aktualizowana jest warto�� zmiennej state w celu zapami�tania aktu-alnego stanu, po czym wywo�ywana jest metoda OnCompleted obiektu zwróconego przez me-tod� GetAwaiter. Nale�y zwróci� uwag�, �e metod�, któr� chcemy wywo�a� po zako�czeniuoperacji, jest aktualnie wykonywana metoda, czyli MoveNext. Takie rozwi�zanie jest stoso-wane zawsze, niezale�nie od ilo�ci zastosowanych s�ów kluczowych await — ka�de wywo-�anie zwrotne wykonywane po zako�czeniu operacji asynchronicznej powoduje wywo�anietej samej metody — po prostu klasa pami�ta, dok�d dotar�a realizacja metody, i wznawia jejdzia�anie od tego miejsca.

Poleć książkęKup książkę

672 � Rozdzia� 18. Asynchroniczne cechy j�zyka

Nie poka�� tu faktycznego kodu generowanego przez kompilator. Jest on skrajnie nieczytelny,gdy� zawiera mnóstwo ca�kowicie niewymawialnych identyfikatorów. (Zapewne pami�tasz z roz-dzia�u 3., �e kiedy kompilator C# musi wygenerowa� identyfikatory, które nie mog� kolido-wa� z naszym kodem ani by� w nim widoczne, to tworzy nazwy, które s� prawid�owe, leczktóre j�zyk C# uznaje za niedozwolone; to w�a�nie takie nazwy s� okre�lane jako niewyma-wialne, ang. unspeakable). Co wi�cej, kod generowany przez kompilator u�ywa ró�nych klaspomocniczych nale��cych do przestrzeni nazw System.Runtime.CompilerServices, które s�przeznaczone wy��cznie do u�ycia w metodach asynchronicznych i s�u�� do zarz�dzania ta-kimi aspektami ich dzia�ania jak okre�lanie, które interfejsy s� dost�pne w danym obiekcie,oraz obs�uga przekazywania kontekstu wykonania. Co wi�cej, je�li metoda zwraca zadanie,to u�ywane s� dodatkowe klasy pomocnicze, które to zadanie tworz� i aktualizuj�. Niemniejjednak je�li chodzi o mo�liwo�� zrozumienia natury zwi�zku pomi�dzy typem wspó�pracu-j�cym ze s�owem kluczowym await oraz kodem generowanym przez kompilator w celu ob-s�ugi tego s�owa kluczowego, to kod z listingu 18.15 jest stosunkowo dobrym przybli�eniem.

Obs�uga b��dówS�owo kluczowe await obs�uguje wyj�tki tak, jak by�my sobie tego �yczyli: je�li wykonanieoperacji asynchronicznej zako�czy si� niepowodzeniem, to wyj�tek zostanie zg�oszony przezwyra�enie await realizuj�ce t� operacj�. Ogólna zasada, zgodnie z któr� kod asynchronicznymo�e mie� tak� sam� struktur� co zwyczajny kod synchroniczny, obowi�zuje tak�e w obliczuzg�aszanych wyj�tków, kompilator robi wszystko co niezb�dne, by zapewni� tak� mo�liwo��.

Listing 18.16 przedstawia dwie asynchroniczne operacje, z których jedna jest wykonywanawewn�trz p�tli. Przypomina to nieco przyk�ad z listingu 18.6. Poni�szy przyk�ad wykonujejednak nieco inne operacje na pobieranych danych, jednak co jest najwa�niejsze — zwracazadanie. Dzi�ki temu istnieje miejsce, do którego mog� trafi� informacje o b��dzie, w przy-padku gdyby wykonanie operacji si� nie uda�o.

Listing 18.16. Kilka potencjalnych �róde� niepowodzenia

private static async Task<string> FindLongestLineAsync(string url){ using (var w = new HttpClient()) { Stream body = await w.GetStreamAsync(url); using (var bodyTextReader = new StreamReader(body)) { string longestLine = string.Empty; while (!bodyTextReader.EndOfStream) { string line = await bodyTextReader.ReadLineAsync(); if (longestLine.Length > line.Length) { longestLine = line; } } return longestLine; } }}

Poleć książkęKup książkę

Obs�uga b��dów � 673

Obs�uga wyj�tków jest potencjalnie sporym wyzwaniem dla operacji asynchronicznych,gdy� w momencie wyst�pienia problemu metoda, która zapocz�tkowa�a wykonywanie ope-racji, zazwyczaj b�dzie ju� zako�czona. Przedstawiona w powy�szym przyk�adzie metodaFindLongestLineAsync zazwyczaj ko�czy dzia�anie w momencie wykonania pierwszegowyra�enia await. (Mo�e si� zdarzy�, �e b�dzie inaczej — je�li analizowany zasób b�dzie do-st�pny w lokalnej pami�ci podr�cznej HTTP, to operacja asynchroniczna mo�e si� natych-miast zako�czy� sukcesem. Jednak zazwyczaj jej wykonanie zajmie nieco czasu, a to oznacza,�e metoda zostanie zako�czona). Za�ó�my, �e wykonanie operacji zako�czy si� pomy�lniei zacznie by� wykonywana dalsza cz��� metody, jednak gdzie� wewn�trz p�tli pobieraj�cejzawarto�� odpowiedzi zostanie przerwane po��czenie sieciowe. W efekcie jedna z operacjirozpocz�tych przez wywo�anie metody ReadLineAsync zako�czy si� niepowodzeniem.

Wyj�tek dla tej operacji zostanie zg�oszony przez wyra�enie await. Wewn�trz tej metody niema �adnego kodu obs�uguj�cego wyj�tki, co zatem powinno sta� si� potem? Zazwyczajoczekiwaliby�my, �e wyj�tek zacznie by� przekazywany w gór� stosu wywo�a�, powstajejednak pytanie, co znajduje si� na stosie powy�ej tej metody? Niemal na pewno nie b�dzie toten sam kod, który j� wywo�a� — pami�tamy zapewne, �e metoda zazwyczaj jest ko�czonaw chwili, gdy dotrze do pierwszego wyra�enia await, a zatem na tym etapie nasz kod za-zwyczaj b�dzie dzia�a� jako efekt wywo�ania zwrotnego wykonanego przez obiekt zwróconyprzez metod� GetAwaiter na potrzeby zadania zwróconego przez metod� ReadLineAsync.Istnieje pewne prawdopodobie�stwo, �e nasz kod b�dzie jeszcze wykonywany w tym samymw�tku z puli, a kod znajduj�cy si� na stosie bezpo�rednio nad nim b�dzie elementem obiektuzwróconego przez metod� GetAwaiter. Jednak ten kod nie b�dzie wiedzia�, co nale�y zrobi�z wyj�tkiem.

Jednak wyj�tek nie jest przekazywany w gór� stosu. Kiedy wyj�tek zg�oszony w metodzieasynchronicznej zwracaj�cej zadanie nie zostanie obs�u�ony, jest on przechwytywany przezkod wygenerowany przez kompilator, który nast�pnie zmienia stan zwracanego zadania, in-formuj�c, �e jego wykonanie zako�czy�o si� niepowodzeniem. Je�li kod wywo�uj�cy metod�FindLongestLineAsync korzysta bezpo�rednio z mo�liwo�ci TPL, to b�dzie on w stanie wy-kry� fakt zg�oszenie wyj�tku, sprawdzaj�c stan zadania, oraz pobra� obiekt wyj�tku, korzy-staj�c z w�a�ciwo�ci Exception zadania. Ewentualnie mo�na tak�e wywo�a� metod� Wait lubodczyta� warto�� w�a�ciwo�ci Result zadania, a ka�da z tych operacji spowoduje zg�oszeniewyj�tku AggregatedException zawieraj�cego obiekt oryginalnego wyj�tku. Je�li jednak kodwywo�uj�cy metod� FindLongesLineAsync u�yje zwróconego obiektu zadania wraz ze s�owemkluczowym await, to wyj�tek zostanie ponownie zg�oszony w tym wyra�eniu. Z punktu wi-dzenia kodu wywo�uj�cego wygl�da to tak, jak gdyby wyj�tek zosta� zg�oszony w normalnysposób, co te� pokazuje przyk�ad z listingu 18.17.

Listing 18.17. Obs�uga wyj�tków zg�aszanych w wyra�eniu await

try{ string longest = await FindLongestLineAsync("http://192.168.22.1/"); Console.WriteLine("Najd�u�szy wiersz: " + longest);}catch (HttpRequestException x){ Console.WriteLine("B��d podczas pobierania strony: " + x.Message);}

Poleć książkęKup książkę

674 � Rozdzia� 18. Asynchroniczne cechy j�zyka

Powy�szy kod jest niemal zwodniczo prosty. Pami�tajmy, �e kompilator przeprowadza bardzog��bok� restrukturyzacj� naszego kodu wokó� ka�dego wyst�pienia s�owa kluczowego awaitoraz �e wykonanie kodu, który z pozoru mo�e si� wydawa� jedn� metod�, w rzeczywisto�cimo�e wymaga� wykonania kilku wywo�a�. Dlatego te� zachowanie semantyki nawet takprostego kodu obs�ugi b��dów (lub podobnych konstrukcji, takich jak instrukcja using) jakten z powy�szego przyk�adu nie jest zadaniem trywialnym. Je�li kiedykolwiek próbowa�e� na-pisa� analogiczny kod obs�ugi b��dów w operacjach asynchronicznych bez korzystania z po-mocy kompilatora, to zapewne docenisz, jak bardzo pomaga w tym C#.

S�owo kluczowe await pobiera oryginalny wyj�tek z obiektu AggregatedExceptioni ponownie go zg�asza. To dzi�ki temu metody asynchroniczne mog� obs�ugiwa�b��dy w taki sam sposób jak zwyczajny kod synchroniczny.

Weryfikacja poprawno�ci argumentówSposób, w jaki C# automatycznie zg�asza b��dy za po�rednictwem obiektu zadania zwraca-nego przez nasz� asynchroniczn� metod� (i to bez wzgl�du na ilo�� u�ywanych wywo�a�zwrotnych), ma jedn� wad�. Powoduje on bowiem, �e kod taki jak ten z listingu 18.18 nie ro-bi tego, na czym mog�oby nam zale�e�.

Listing 18.18. W jaki sposób nie nale�y sprawdza� poprawno�ci argumentów

public async Task<string> FindLongestLineAsync(string url){ if (url == null) { throw new ArgumentNullException("url"); } ...

Wewn�trz metody asynchronicznej kompilator traktuje wszystkie wyj�tki w taki sam sposób:�aden z nich nie mo�e zosta� przekazany w gór� stosu, jakby si� to sta�o w normalnej meto-dzie, i ka�dy zostanie zasygnalizowany poprzez odpowiedni� zmian� stanu zwracanego za-dania — zostanie ono oznaczone jako zako�czone niepowodzeniem. Dotyczy to nawet tychwyj�tków, które s� zg�aszane przed wykonaniem s�owa kluczowego await. W naszym przy-k�adzie weryfikacja argumentów jest wykonywana, zanim metoda wykona jakiekolwiek inneoperacje, zatem w tym przypadku nasz kod b�dzie wykonywany w tym samym w�tku, w któ-rym metoda zosta�a wywo�ana. Mo�na by pomy�le�, �e wyj�tek zg�oszony w tym miejscu koduzostanie przekazany bezpo�rednio do kodu wywo�uj�cego. W rzeczywisto�ci jednak zauwa�yon jedynie zwyczajne zako�czenie metody zwracaj�cej obiekt zadania, przy czym stan tegozadania b�dzie informowa�, �e zako�czy�o si� ono niepowodzeniem.

Je�li metoda wywo�uj�ca od razu wykona zwrócone zadanie, u�ywaj�c do tego celu s�owakluczowego await, to nie b�dzie to mia�o wi�kszego znaczenia — wyj�tek i tak zostanieprzez ni� zauwa�ony. Jednak mo�e si� zdarzy�, �e kod nie b�dzie chcia� od razy wykona�zadania, a w takim przypadku wyj�tek nie zostanie zauwa�ony tak szybko. Ogólnie przyj�takonwencja zwi�zana ze stosowaniem i obs�ug� prostych wyj�tków zwi�zanych z weryfikacj�argumentów zaleca, by w przypadkach, gdy nie ma w�tpliwo�ci, �e problem zosta� spowo-dowany kodem przez kod wywo�uj�cy, wyj�tek nale�y zg�osi� natychmiast. A zatem w po-wy�szym przyk�adzie naprawd� powinni�my wymy�li� co� innego.

Poleć książkęKup książkę

Obs�uga b��dów � 675

Je�li nie ma mo�liwo�ci sprawdzenia poprawno�ci argumentów bez wykonywaniajakich� d�ugotrwa�ych operacji, to chc�c napisa� naprawd� asynchroniczn� metod�,nie b�dziemy w stanie zastosowa� si� do powy�szej konwencji. W takim przypadkutrzeba b�dzie podj�� decyzj�, czy wolimy, by metoda zosta�a zablokowana do mo-mentu, gdy b�dzie w stanie sprawdzi� poprawno�� argumentów, czy te� by wyj�tkidotycz�ce argumentów metody by�y zg�aszane za po�rednictwem zadania, a niebezpo�rednio.

Standardowym rozwi�zaniem jest napisanie normalnej metody, która sprawdzi poprawno��argumentów przed wywo�aniem metody asynchronicznej, wykonuj�cej zamierzone operacje.(Okazuje si�, �e w podobny sposób nale�a�oby post�powa� w przypadku przeprowadzanianatychmiastowej wersyfikacji argumentów iteratora. Iteratory zosta�y opisane w rozdziale 5.).Listing 18.19 przedstawia w�a�nie tak� metod� publiczn� oraz pocz�tek samej metody asyn-chronicznej.

Listing 18.19. Weryfikacja argumentów metody asynchronicznej

public Task<string> FindLongestLineAsync(string url){ if (url == null) { throw new ArgumentNullException("url"); } return FindLongestLineCore(url);}

private async Task<string> FindLongestLineCore(string url){ ...

Poniewa� metoda publiczna nie zosta�a oznaczona jako asynchroniczna (nie dodano do niejmodyfikatora async), zatem wszelkie zg�aszane przez ni� wyj�tki b�d� przekazywane bezpo-�rednio do kodu wywo�uj�cego. Natomiast wszelkie problemy, które nast�pi� po rozpocz�ciuprywatnej metody asynchronicznej, b�d� zg�aszane za po�rednictwem obiektu zadania.

Wyj�tki pojedyncze oraz grupy wyj�tkówZ rozdzia�u 17. mo�na si� by�o dowiedzie�, �e TPL definiuje model pozwalaj�cy na raporto-wanie wielu b��dów — w�a�ciwo�� Exception zadania zwraca obiekt AggregatedException.Nawet je�li pojawi si� tylko jeden problem, to i tak informacje o nim trzeba b�dzie pobiera�z obiektu AggregateException. Niemniej jednak w razie stosowania s�owa kluczowegoawait to pobranie wyj�tku jest wykonywane automatycznie za nas — jak mieli�my si� okazj�przekona� w przyk�adzie z listingu 18.17, pobiera on pierwszy wyj�tek zapisany w tablicyInnerExcecptions, a nast�pnie ponownie go zg�asza.

Takie rozwi�zanie jest wygodne, je�li w operacji mo�e wyst�pi� tylko jeden problem — niemusimy bowiem pisa� �adnego dodatkowego kodu, który by obs�ugiwa� ten grupowy wy-j�tek i pobiera� jego zawarto��. (Je�li korzystamy z zadania zwróconego przez metod� asyn-chroniczn�, to nigdy nie b�dzie ono zawiera� wi�cej ni� jednego wyj�tku). Jednak takie roz-wi�zanie przysparza problemów, kiedy pos�ugujemy si� z�o�onymi zadaniami, w którychjednocze�nie mo�e si� pojawi� kilka wyj�tków. Na przyk�ad do metody Task.WhenAll prze-kazywana jest kolekcja zada�, a metoda ta zwraca jedno zadanie, które zostanie zako�czone

Poleć książkęKup książkę

676 � Rozdzia� 18. Asynchroniczne cechy j�zyka

wy��cznie w przypadku, gdy wszystkie zadania podrz�dne zostan� prawid�owo zako�czone.Je�li które� z nich zako�cz� si� niepowodzeniem, to uzyskamy obiekt AggregateExceptionzawieraj�cy wiele b��dów. W razie u�ycia s�owa kluczowego await do obs�ugi takiego zadaniazg�osi ono wy��cznie pierwszy z wyj�tków.

Standardowe mechanizmy TPL — metoda Wait oraz w�a�ciwo�� Result — udost�pniaj� pe�enzbiór b��dów, jednak blokuj� wykonywanie w�tku, je�li zadanie jeszcze nie zosta�o zako�-czone. A co mogliby�my zrobi�, gdyby�my chcieli skorzysta� z wydajnego, asynchronicznegodzia�ania s�owa kluczowego await, które wykonuje co� w w�tkach, wy��cznie je�li znajdzie si�dla nich co� do zrobienia, a jednocze�nie chcieliby�my zauwa�a� wszystkie wyj�tki? Jednoz potencjalnych rozwi�za� zosta�o przedstawione na listingu 18.20.

Listing 18.20. Zastosowanie s�owa kluczowego await i metody Wait

static async Task CatchAll(Task[] ts){ try { var t = Task.WhenAll(ts); await t.ContinueWith( x => {}, TaskContinuationOptions.ExecuteSynchronously); t.Wait(); } catch (AggregateException all) { Console.WriteLine(all); }}

Powy�sza metoda u�ywa s�owa kluczowego await, by skorzysta� z wydajno�ci asynchro-nicznych metod C#, jednak zamiast stosowa� je wraz z samym zadaniem z�o�onym, u�ywa gowraz z zadaniem, do którego zosta�a dodana kontynuacja. Kontynuacja mo�e zosta� pomy�l-nie zako�czona, je�li zostanie zako�czona poprzedzaj�ca j� operacja, niezale�nie od tego, czyzako�czy si� ona pomy�lnie, czy te� nie. Zastosowana kontynuacja jest pusta, wi�c wewn�trzniej nie mog� wyst�pi� �adne problemy, a to oznacza, �e w tym miejscu nie zostan� zg�oszone�adne wyj�tki. Natomiast je�li wykonanie którejkolwiek z operacji zako�czy�o si� niepowo-dzeniem, to wywo�anie metody Wait spowoduje zg�oszenie wyj�tku AggregatedException— dzi�ki temu blok catch b�dzie w stanie zauwa�y� wszystkie wyj�tki. Co wi�cej, poniewa�metoda Wait jest wykonywana dopiero po zako�czeniu realizacji wyra�enia await, zatemwiemy, �e zadanie zosta�o zako�czone, a zatem wywo�anie to nie spowoduje zablokowaniametody.

Jedn� z wad takiego rozwi�zania jest to, �e tworzy ono dodatkowe zadanie tylko po to, by�mymogli zaczeka� bez nara�ania si� na napotkanie wyj�tku. W powy�szym przyk�adzie konty-nuacja zosta�a skonfigurowana w taki sposób, �e jest wykonywana synchronicznie, dzi�kiczemu unikamy realizacji drugiego fragmentu kodu przy u�yciu puli w�tków; niemniej jed-nak i tak stanowi to marnowanie zasobów. Nieco bardziej zagmatwane, lecz jednocze�niebardziej wydajne rozwi�zanie mog�oby polega� na u�yciu s�owa kluczowego await w stan-dardowy sposób i napisaniu kodu obs�ugi wyj�tków w taki sposób, by sprawdza� on, czy niezosta�o zg�oszonych wi�cej wyj�tków. Takie rozwi�zanie przedstawia listing 18.21.

Poleć książkęKup książkę

Obs�uga b��dów � 677

Listing 18.21. Poszukiwanie dodatkowych wyj�tków

static async Task CatchAll(Task[] ts){ Task t = null; try { t = Task.WhenAll(ts); await t; } catch (Exception first) { Console.WriteLine(first); if (t != null && t.Exception.InnerExceptions.Count > 1) { Console.WriteLine("Znaleziono wicej wyj�tków:"); Console.WriteLine(t.Exception); } }}

To rozwi�zanie pozwala unikn�� tworzenia drugiego zadania, jednak jego wad� jest to, �ewygl�da nieco dziwnie.

Operacje równoleg�e i nieobs�u�one wyj�tkiNajprostszym sposobem u�ywania s�owa kluczowego await jest wykonywanie kolejnychoperacji jedna po drugiej dok�adnie w taki sam sposób, jaki robimy to w kodzie synchronicz-nym. Cho� wydaje si�, �e dzia�anie ca�kowicie sekwencyjne nie pozwala wykorzystywa�ca�ego potencja�u kodu asynchronicznego, to jednak zapewnia mo�liwo�� znacznie wydaj-niejszego wykorzystania dost�pnych w�tków ni� u�ycie analogicznego kodu synchroniczne-go, a dodatkowo w aplikacjach klienckich doskonale wspó�pracuje z kodem obs�ugi interfejsuu�ytkownika. Jednak mo�na pój�� jeszcze dalej.

Istnieje mo�liwo�� jednoczesnego uruchomienia kilku ró�nych operacji. Mo�na wywo�a�metod� asynchroniczn�, a nast�pnie zamiast od razu skorzysta� ze s�owa kluczowego await,mo�na zapisa� wynik w zmiennej i w podobny sposób uruchomi� drug� operacj� asynchro-niczn�, po czym zaczeka� na zako�czenie obu. Cho� takie rozwi�zanie jest mo�liwe do wy-konania, to jednak kryje ono w sobie pewn� pu�apk� na nieostro�nych programistów; przed-stawia j� przyk�ad z listingu 18.22.

Listing 18.22. W jaki sposób nie nale�y wykonywa� wielu wspó�bie�nych operacji

static async Task GetSeveral(){ using (var w = new HttpClient()) { w.MaxResponseContentBufferSize = 2000000;

Task<string> g1 = w.GetStringAsync("http://helion.pl/"); Task<string> g2 = w.GetStringAsync("http://helion.pl/kategorie/programowanie/c-sharp");

// B�D!

Console.WriteLine((await g1).Length); Console.WriteLine((await g2).Length); }}

Poleć książkęKup książkę

678 � Rozdzia� 18. Asynchroniczne cechy j�zyka

Powy�sza metoda pobiera równocze�nie zawarto�� dwóch stron WWW. Po uruchomieniuobu operacji metoda u�ywa s�owa kluczowego await, by pobra� ich wyniki i wy�wietli� d�ugo-�ci zwróconych �a�cuchów znaków. Je�li operacje zako�cz� si� pomy�lnie, to powy�szy kodzadzia�a prawid�owo, jednak nie zapewnia on prawid�owej obs�ugi b��dów. Je�li wykonaniepierwszej operacji zako�czy si� niepowodzeniem, to powy�szy kod nigdy nie wykona dru-giego wyra�enia await. To oznacza, �e je�li tak�e druga operacja zako�czy si� niepowodzeniem,to nie b�dzie kodu, który móg�by sprawdzi� zg�oszone wyj�tki. W ko�cu TPL wykryje, �e wy-j�tki nie zosta�y zauwa�one, co spowoduje zg�oszenie wyj�tku UnobservedTaskException,a on najprawdopodobniej doprowadzi do awarii programu. (Zagadnienia zwi�zane z obs�ug�niezaobserwowanych wyj�tków zosta�y opisane w rozdziale 17.). Problem polega na tym, �etakie sytuacje zdarzaj� si� bardzo rzadko — konieczne jest bowiem, by obie operacje zako�-czy�y si� niepowodzeniem i to w bardzo krótkim odst�pie czasu — a zatem bardzo �atwo b�dzieje przegapi� podczas testowania aplikacji.

Takich problemów mo�na unikn�� dzi�ki uwa�nej obs�udze b��dów — na przyk�ad mo�naprzechwytywa� wszystkie wyj�tki zg�aszane przez pierwsze wyra�enie await przed wyko-naniem drugiego z nich. Ewentualnie mo�na tak�e skorzysta� z metody Task.WhenAll, bypoczeka� na wyniki obu operacji wykonywanych w formie jednego zadania — w takim przy-padku, gdyby nie uda�o si� wykona� którejkolwiek z operacji, uzyskaliby�my zadanie zako�-czone niepowodzeniem, z informacjami o b��dach zapisanymi w obiekcie AggregatedException,dzi�ki czemu mogliby�my sprawdzi� wszystkie zg�oszone wyj�tki. Oczywi�cie jak mogli�mysi� przekona�, obs�uga wielu b��dów w przypadku korzystania ze s�owa kluczowego awaitmo�e by� dosy� k�opotliwa. Je�li jednak chcemy uruchamia� wiele asynchronicznych operacjii pozwoli�, by wszystkie by�y wykonywane jednocze�nie, to kod niezb�dny do koordynacjiuzyskiwanych wyników b�dzie bardziej z�o�ony ni� w przypadku wykonywania tych samychoperacji sekwencyjnie. Niemniej jednak s�owa kluczowe await oraz async i tak znacznieu�atwiaj� nam �ycie.

PodsumowanieOperacje asynchroniczne nie blokuj� w�tku, w którym zosta�y rozpocz�te; dzi�ki temu s�bardziej wydajne od zwyczajnych metod synchronicznych, co ma szczególnie du�e znaczeniena bardzo obci��onych komputerach. Ta cecha sprawia równie�, �e z powodzeniem mo�naz nich korzysta� w aplikacjach klienckich, gdy� pozwalaj� na wykonywanie d�ugotrwa�ychoperacji bez obni�ania szybko�ci reakcji interfejsu aplikacji na dzia�ania u�ytkownika. Jednakwad� operacji asynchronicznych zawsze by�a ich wysoka z�o�ono��, dotyczy to w szczegól-no�ci obs�ugi b��dów w przypadku stosowania wielu powi�zanych ze sob� operacji. W j�zykuC# 5.0 wprowadzono s�owo kluczowe await, które pozwala na pisanie kodu asynchronicz-nego w sposób bardzo zbli�ony do zwyczajnego kodu synchronicznego. Sprawy si� niecokomplikuj�, je�li chcemy, by jedna metoda zarz�dza�a kilkoma operacjami wykonywanymirównolegle, jednak nawet je�li napiszemy t� metod� w taki sposób, �e poszczególne operacjeasynchroniczne b�d� wykonywane w �ci�le okre�lonej kolejno�ci, to i tak uzyskamy korzy�ci.W przypadku aplikacji serwerowej t� korzy�ci� b�dzie znacznie bardziej wydajne wykorzy-stanie w�tków, dzi�ki czemu taka aplikacja b�dzie w stanie obs�u�y� wi�ksz� liczb� jedno-cze�nie dzia�aj�cych u�ytkowników, gdy� ka�da z operacji b�dzie zu�ywa� mniej zasobów.Natomiast w przypadku aplikacji klienckich t� korzy�ci� b�dzie dzia�aj�cy sprawniej interfejsu�ytkownika.

Poleć książkęKup książkę

Podsumowanie � 679

Metody korzystaj�ce ze s�owa kluczowego await musz� by� oznaczone przy u�yciu modyfi-katora async i powinny zwraca� wynik typu Task lub Task<T>. (C# pozwala tak�e na zwra-canie wyniku typu void, jednak zazwyczaj jest on stosowany wy��cznie w ostateczno�ci, gdynie ma innego wyboru). Kompilator zadba o to, by zadanie zosta�o zako�czone pomy�lnie,je�li nasza metoda zostanie prawid�owo wykonana, oraz by zako�czy�o si� niepowodzeniem,je�li w trakcie wykonywania metody pojawi� si� jakiekolwiek problemy. Poniewa� s�owokluczowe await mo�e operowa� na ka�dym obiekcie Task lub Task<T>, zatem u�atwia onorozdzielenie logiki asynchronicznej na wiele metod, gdy� metoda nadrz�dna mo�e u�ywa�go do wykonywania metod podrz�dnych. Zazwyczaj faktyczne operacje s� wykonywaneprzez jakie� metody wykorzystuj�ce zadania, jednak nie jest to regu��, gdy� s�owo kluczoweawait wymaga jedynie u�ycia okre�lonego wzorca — mo�na w nim poda� dowolne wyra�eniepozwalaj�ce na wywo�anie metody GetAwaiter w celu uzyskania obiektu odpowiedniego typu.

Poleć książkęKup książkę

680 � Rozdzia� 18. Asynchroniczne cechy j�zyka

Poleć książkęKup książkę

821

Skorowidz

.NET Core Profile, 490, 497, 607

.NET Framework, 22

Aabstrakcja w�tków, 600abstrakcyjna implementacja

interfejsu, 223abstrakcyjny typ bazowy, 234adnotacje do danych, 772adres URL, 766agregacja, 379akcesor

get, 130set, 130

akumulator, accumulator, 380anatomia podzespo�u, 464animacje zmiany stanu, 724ANSI, 576anulowanie d�ugotrwa�ych

operacji, 652apartament wielow�tkowy,

MTA, 550API, 22

asynchroniczne, 454, 492odzwierciedlania, 495, 502

aplikacjeGUI, 467internetowe, 741konsolowe, 467, 557OOB, 686Windows 8, 490Windows Phone, 492Windows Runtime, 713XBAP, 492

APM, AsynchronousProgramming Model, 454, 565,651

architekturaprocesora, 487wspólnego j�zyka, 26, 819

argument typu, 149, 179argumenty opcjonalne, 127ASCII, 51, 574, 787ASP.NET, 741

MVC, 762Razor, 742trasowanie, 777Web Forms, 752

asynchroniczna metodaanonimowa, 668

asynchroniczne wyra�enielambda, 667

atak XSS, 743atrybut

[CallerMemberName], 543[ComImport], 806[DataContract], 594[DataMember], 594[MTAThread], 550[NonSerialized], 594[Obsolate], 578[Serializable], 591[STAThread], 550[TestClass], 535, 536[ThreadStatic], 604, 606AggresiveInlining, 549AssemblyFileVersion, 482AssemblyKeyFileAttribute,

540DebuggableAttribute, 549DllExport, 785DllImport, 787, 807, 819ExpectedExceptionAttribute,

537Flags, 143InternalsVisibleToAttribute,

543, 544

LoaderOptimizationAttribute,549

MarshalAs, 784NoOptimization, 549OnClick, 753SecurityCriticalAttribute,

669SecuritySafeCriticalAttribute,

548SerializableAttribute, 546StructLayout, 791TestCategoryAttribute, 536ThreadStaticAttribute, 605TypeIdentifier, 810x:Class, 690x:Name, 691xmlns:x, 690

atrybuty, 46, 535–556okre�lanie celu, 552stosowanie, 535ustawienia opcjonalne, 537warto�ci opcjonalne, 553

atrybutymetody, 538modu�u, 538niestandardowe, 547, 551obs�ugiwane przez

CLR, 543kompilator, 539

okre�laj�ce numer wersji,539

podzespo�u, 538pola zdarzenia, 539w�asne, custom attributes,

167z informacjami o

kodzie wywo�uj�cym, 541podzespole, 540

automatyzacja COM, 522, 524

Poleć książkęKup książkę

822 � Skorowidz

Bbezpiecze�stwo, 546, 794

pod wzgl�demwielow�tkowym, 603

typów, 28, 162, 216, 818bezpieczne uchwyty, 793bia�e znaki, whitespace, 66biblioteka

advapi32.dll, 787jQuery, 764Knockout, 764Modernizr, 764Moq, 157mscoree.dll, 464mscorelib.dll, 403ole32.dll, 798, 800Reactive Extensions, 401System.Observable.dll, 404System.Web.dll, 42System.Windows.

Controls.dll, 492TPL, 263, 325, 446, 610, 640

bibliotekiDLL, 464klas, 22, 40, 488typów, 809

blok, 55catch, 286, 287CER, 307finally, 290, 623lock, 620try, 289

blokady odczytu i zapisu, 627blokowanie, 621b��d, error, 225

kompilacji, 563obserwatora, 409

BOM, byte order mark, 573

CC++/CLI, 819CCW, COM-callable wrapper,

788cechy C#, 25cel, target, 31, 463cel atrybutu, 537CER, constrained execution

region, 306ciasteczka, cookies, 743ci�g Fibonacciego, 358

CLI, Common LanguageInfrastructure, 26, 819

ClickOnce, 491CLR, Common Language

Runtime, 22, 238, 465, 495, 803CLS, Common Language

Specification, 26, 72COM, Component Object

Model, 521, 798COM Automation, 522Component Extensions, 820CTS, Common Type System, 22czas

trwania zdarzenia, 424�ycia obiektów, 237, 252

COM, 803RCW, 803

cz��ciowe deklaracje klas, 146

Ddebuger Visual Studio, 45, 660debugowanie, 281, 303

aplikacji, 293wyj�tków, 304

definiowanieklasy, 44, 150konstruktora, 117

deklaracjaindeksatora, 134przestrzeni nazw, 42typu ogólnego, 150zmiennej, 50

delegaty, delegate, 144, 310, 416Action, 318Func, 318typu Predicate<int>, 312typu Predicate<T>, 312zbiorowe, 314, 316

deserializacja, 592deserializacja wyj�tku, 300destruktory, destructors, 237,

261diagram aktywno�ci Rx, 406DirectX, 24disassembler kodu .NET, 191DLL, Dynamic Link Library, 33DLR, Dynamic Language

Runtime, 521d�ugo�� strumienia, 562dodatek Service Pack, 295dodawanie projektów do solucji,

35

dokumentacja MSDN, 547DOM, Document Object Model,

399domena aplikacji, appdomain,

300, 549domy�lna implementacja

zdarze�, 340domy�lne warto�ci

argumentów, 128domy�lny konstruktor

bezargumentowy, 230dopisywanie �a�cucha do pliku,

584dostawca

CustomLinqProvider, 356LINQ to Entities, 364LINQ to Objects, 364LINQ to SQL, 367SillyLinqProvider, 356

dostawcy LINQ, 347dost�p do

bufora, 818elementu tablicy, 167obiektu, 240, 602obiektu Request, 748pola, 130prywatnego stanu, 621sk�adowych, 115sk�adowych klas bazowych,

229systemu plików, 529w�z�a listy, 202

dost�pno��, 218metod, 130obiektu, 245

drzewoelementów interfejsu

u�ytkownika, 688wyra�enia, 336

dynamicznej�zyki .NET, 525okre�lanie typów, 517tworzenie delegatów, 314

dyrektywa#define, 67#endregion, 70#error, 68#line, 69#pragma, 69#region, 70#warning, 68using, 40, 129, 354

dyrektywy preprocesora, 67

Poleć książkęKup książkę

Skorowidz � 823

dzia�aniekonwersji, 529operatorów, 362s�owa kluczowego await,

670dziedziczenie, inheritance, 207,

230interfejsów, 210typów odzwierciedlania, 496

EEAP, Event-based

Asynchronous Pattern, 651edycja tekstu, 727edytor plików zasobów, 485efektywne wykorzystanie

pami�ci, 339element

@RenderBody, 750@RenderSection, 750CheckBox, 714ContentPresenter, 722Ellipse, 702Grid, 692ItemsPresenter, 722MediaElement, 737ResourceDictionary, 739RowDefinition, 709StackPanel, 692TextBlock, 725, 738TextBox, 694, 725

elementylisty, 734podrz�dne, 692w�a�ciwo�ci, property

elements, 693Entity Framework, 367, 397etykiety ekranowe, ToolTip, 716

FFIFO, first-in, first-out, 201filtrowanie

danych, 364elementów, 421

finalizacja, finalization, 237, 261finalizator, 220, 263, 270finalizatory krytyczne, 264flaga

AttachedToParent, 650ExecuteSynchronously, 645LongRunning, 641

newslot, 227OnlyOnRanToCompletion,

644PreferFairness, 641useAsync, 581

formatJSON, 30PE, 464, 466resx, 484XML, 31

formatowanie tekstu, 728funkcja

BackEventLogA, 787BackupEventLog, 793EnumWindows, 789GetVersionEx, 791OpenEventLog, 794

funkcje anonimowe, 326

GGAC, Global Assembly Cache,

474, 482, 494GC, garbage collector, 237generowanie

elementów, 420kodu, 329nazwy klasy, 330sekwencji, 396widoków, 741

g�ówny podzespó�wspó�dzia�ania, 809

gniazda uk�adu, layout slot, 698grafika

bitmapy, 736kszta�ty, 735media, 737

grupowanie, 386grupowanie zdarze�, 423grupuj�ce wyra�enie zapytania,

386grupy wyj�tków, 675

Hhermetyzacja, encapsulation, 95heurystyki tworzenia w�tków,

612hiperw�tkowo��,

hyperthreading, 600HPC, High-Performance

Computing, 369

IIANA, 577identyfikator

assebmlyName, 779CLSID, 809GUID, 113, 799, 806IID, 805kulturowy, 484ProdID, 809

IIS, Internet Information Server,741

IL, intermediate language, 27implementacja

interfejsu, 141IEnumerable<T>, 450INotifyPropertyChanged,

542IObservable<T>, 407, 414

list, 189operatora +, 136p�tli asynchronicznej, 665wzorca await, 670róde� ciep�ych, 410róde� zimnych, 407

importowaniefunkcji, 789przestrzeni nazw, 760warto�ci wynikowej, 798

indeksatory, 134informacje

o atrybutach, 554o klasach, 809o kodzie wywo�uj�cym, 541o metodzie, 541o pliku, 588o podzespole, 540o typach, 776, 779, 809o wtyczkach, 554o wyj�tku, 283o zdarzeniu, 339

inicjalizacja statyczna, 124inicjalizatory, 51, 92

list, 184pól, 120, 232pól niestatycznych, 117pól statycznych, 123s�ownika, 198tablic, 168, 179

instrukcjabreak, 90continue, 91fixed, 819

Poleć książkęKup książkę

824 � Skorowidz

instrukcjagoto, 90if, 87lock, 622switch, 89unchecked, 563using, 331yield return, 358

instrukcje, statements, 59blokowe, 88deklaracji, 59iteracyjne, 59sprawdzane, 78wyboru, 59wyra�e�, 59, 62

interfejsCOM, 805IBuffer, 816IClickHandler, 310ICloneable, 102ICollection, 183ICollection<T>, 185, 188, 214IComparer<T>, 153, 214, 345ICustomAttributeProvider,

553IDictionary<TKey, TValue>,

197IDisposable, 237, 265–274,

406, 411, 564, 571, 794IDynamicMetaObjectProvid

er, 528IEnumerable<T>, 93, 140,

185, 212, 402, 450IHomeGroup, 806IList<T>, 185, 187INotifyPropertyChanged,

542, 731IObservable<T>, 344, 401–406,

450IObserver<T>, 402, 405, 450IQueryable, 360IQueryable<T>, 359IQueryProvider, 360IRandomAccessStream, 566IReadOnlyList<T>, 189, 217ISerializable, 300ISet<T>, 200, 226

interfejsy, 131, 140, 345interfejsy Rx, 403IPC, interprocess

communication, 566iterator, 92, 190iterator niesko�czony, 191

Jjawna implementacja interfejsu,

141jawne

delegaty instancji, 313operatory konwersji, 137przekazywanie

argumentów, 170mechanizmów

szereguj�cych, 445warto�ci typu

wyliczeniowego, 142wczytywanie podzespo�ów,

473wywo�ywanie konstruktora,

231j�zyk

C#, 21C++, 22F#, 22IronPython, 22, 525IronRuby, 22, 525Java, 23JavaScript, 23Objective-C, 23po�redni, IL, 27VBA, 522Visual Basic, 22, 29XAML, 287, 492, 681

j�zykidynamiczne, 517skryptowe, 811

JIT, just in time, 27JSON, 30

Kkatalog

App_Code, 749App_Data, 764App_Start, 777AppData, 589ApplicationData, 589Biblioteka, 789Common, 739Content, 764Controllers, 772Models, 769Reflection, 771Scripts, 764Views, 767, 771

klasa, 44, 95ActionResult, 766AfterYou, 125AppDomain, 302ApplicationData, 589ArgumentException, 296ArgumentOutOfRange�Exception, 296

Assembly, 465, 473, 496, 769AssemblyModel, 771AsyncSubject<T>, 449Attribute, 552AutoResetEvent, 631Barrier, 631Base, 208BaseWithVirtual, 220bazowa object, 158BehaviorSubject<T>, 448BinarWriter, 591BinaryReader, 591Block, 727BlockingCollection<T>, 203BlockUIContainer, 727BufferedStream, 566Capture, 41Collection<T>, 194CollectionView, 344COM, 807Complex, 168ConcurrentQueue<T>, 203ConcurrentStack<T>, 203ConstructorInfo, 512ContentControl, 714Control, 713, 714Controller, 767ControlScheduler, 442CoreDispatcherScheduler, 442CountdownEvent, 632Counter, 101CourseChoice, 390CriticalFinalizerObject, 265CryptoStream, 566CultureInfo, 348CustomerDerived, 224, 227CustomLinqProvider, 355DataContractJsonSerialization,

596DataContractJsonSerializer,

597DataContractSerialization, 596DateTimeOffset, 442Debug, 68DeflateStream, 566

Poleć książkęKup książkę

Skorowidz � 825

Delegate, 317Derived, 208Dictionary<TKey, TValue>,

196, 618Directory, 268, 585DirectoryInfo, 588Dispatcher, 696DispatcherObservable, 444DispatcherScheduler, 442DynamicFolder, 530DynamicObject, 528Encoding, 572Environment, 296EventInfo, 514EventLoopScheduler, 445EventPattern<T>, 452Exception, 286, 298ExceptionDispatchInfo, 295ExecutionContext, 617ExpandoObject, 531Expression, 335FieldInfo, 513File, 581, 583FileInfo, 588FileNotFoundException, 288FileStream, 271, 562–565, 578FileSystemInfo, 588FileSystemWatcher, 789FlowDocument, 726FrameworkElement, 690,

698, 725, 738GCHandle, 240Grid, 707GZipStream, 566HashSet, 200HashSet<T>, 319HomeController, 765ImageBrush, 737Interlocked, 100, 634, 636InternalsVisibleToAttribute,

39IOException, 288ItemsControl, 719, 722KeyWatcher, 412Lazy<T>, 152, 637LazyInitializer, 100, 638LibraryBase, 225LinkedList<T>, 202List<T>, 162, 182, 619ManualResetEvent, 628, 632ManualResetEventSlim, 631ManualResetState, 628Marshal, 802

MemberInfo, 503, 511MemoryStream, 564MethodBase, 511MethodBody, 511MethodInfo, 512Mock<T>, 157ModelSource, 770, 773, 775ModeSource, 781Module, 502Monitor, 619, 622MoreDerived, 208MulticastDelegate, 314, 319,

323Mutex, 633NewThreadScheduler, 446NoAfterYou, 125Observable, 414, 418, 452Page, 692, 761Parallel, 653ParameterInfo, 512Path, 42, 578, 586PipeStream, 566Prediecate<T>, 319ProgressBar, 718PropertyInfo, 513publiczna, 97Queue<T>, 202Random, 174ReaderWriterLock, 627ReaderWriterLockSlim, 621,

627ReadOnlyCollection<T>,

188, 195ReflectionController, 776ReplySubject<T>, 449ResourceManager, 484, 486RuntimeHelpers, 307SafeHandle, 265, 307, 793SaleLog, 620ScarceEventSource, 342Semaphore, 632SemaphorSlim, 633Shape, 215SmtpClient, 629, 648SortedDictionary<TKey,

TValue>, 199SortedSet, 200Source<T>, 359SpinLock, 625Stack<T>, 202StateStore, 567Stopwatch, 77StorageFile, 568

Stream, 258, 558–570StreamReader, 283, 572StreamWriter, 572StringBuilder, 81StringComparer, 198, 471StringReader, 573StringWriter, 573Subject<T>, 447SynchronizationContext, 615SynchronizationContext�Scheduler, 442

System.Array, 234System.Attribute, 535System.Exception, 234System.GC, 260System.Object, 234System.String, 776TabControl, 721Task, 610, 640, 647, 650Task<T>, 640TaskCompletionSource<T>,

648TaskPoolScheduler, 446TaskScheduler, 446, 645testu jednostkowego, 37TextReader, 570, 571TextWriter, 570, 571Thread, 606, 607ThreadLocal<T>, 605ThreadPool, 611, 613, 630ThreadPoolScheduler, 446ThresholdComparer, 313,

329Type, 497, 499, 506TypeDescriptor, 514TypeInfo, 497, 507, 508TypModel, 774UnicodeEncoding, 574VariableSizedWrapGrid, 709ViewResult, 766VisualStateManager, 723WaitHandle, 630WeakReferece, 247WebClient, 455, 640, 646WindowsObservable, 454WindowsRuntimeStreamExt

ensions, 568WrapPanel, 711XmlReader, 573XmlSerializer, 597

klasykolekcji wspó�bie�nych, 639konkretne, 222

Poleć książkęKup książkę

826 � Skorowidz

klasyogólne, 150ostateczne, 228statyczne, 100wewn�trzne, 97

klauzulaelse, 87from, 349group, 350, 386join, 390let, 352orderby, 372select, 350, 366, 422where, 349, 354, 421

klient WCF Data Services, 398klip wideo, 737klucz

grupowania, 389InprocServer32, 809PageHeaderTextStyle, 739

klucze silnych nazw, 478kod

formularza, 755IL, 465kontrolera HomeController,

765maszynowy, machin code,

27niezarz�dzany, 240, 258rodzimy, 783ukryty, codebehind, 690uwierzytelniania

komunikatu, MAC, 755widoku g�ównego, 780widoku Index, 768zarz�dzany, 27

kodeki, 738kodowanie, 574

ASCII, 51, 574, 787ISO/IEC 8859-5, 569UTF-8, 569Windows-1252, 569

kody mieszaj�ce, 198kolejka, 201

FIFO, 611, 612LIFO, 611

kolejno��inicjalizacji, 122przetwarzania operandów,

64tworzenia obiektów, 232

kolekcja, 93, 165commaCultures, 359wyj�tków, 647

kolekcjebezpieczne, 603leniwe, lazy collections, 94wspó�bie�ne, 203

kolizjakodów mieszaj�cych, 109nazw, 100, 225

komentarzejednowierszowe, 65oddzielone, delimited

comments, 65wielowierszowe, 66

kompilacjaJIT, 548warunkowa, 67

kompilator XAML, 690komponent, 463, 493komponent programowy, 463komunikacja pomi�dzy

procesami, ICP, 566komunikat o b��dzie, 55konfiguracja budowania

Debug, 68Release, 68

konflikt nazw, 56, 470konkatenacja, 54konstruktor, 117

bezargumentowy, 107, 119,231

domy�lny, 118klasy bazowej, 231klasy pochodnej, 231statyczny, 121

konstruktoryklasy FileStream, 580klasy Thread, 608

kontekstodzwierciedlania, reflection

contexts, 514odzwierciedlania

niestandardowy, 515synchronizacji, 662wykonywania, execution

context, 607, 662konteksty sprawdzane, 77kontener StackPanel, 699kontrawariancja, 151, 212kontrawariantny parametr typu,

215kontroler

HomeController, 765, 778ReflectionController, 773,

781

kontrolkaButton, 714, 717, 722CheckBox, 715ComboBox, 709, 715, 719ListBox, 715, 719, 733ProgressBar, 719RadioButton, 715RichTextBlock, 727RichTextBlockOverflow, 727RichTextBox, 728ScrollBar, 718ScrollViewer, 712, 716Slider, 717, 719TabControl, 721TextBox, 727, 731ToolTip, 716WebBrowser, 811

kontrolkilist, 720post�pów, 718serwerowe, server-side

controls, 752serwerowe HTML, 756u�ytkownika, user controls,

303, 724z zawarto�ci�, 714

kontynuacje, 643konwencja

cdecl, 796stdcall, 796

konwencje nazewnicze, 96konwersja, 392

delegatów, 320delegatów zbiorowych, 322jawna liczb, 75niedozwolona delegatów,

320niejawna liczb, 74niestandardowa, 529wyra�enia zapytania, 351

ko�czenie operacji wej�cia-wyj�cia, 614

kopiowanieinstancji, 102podzespo�ów, 525referencji, 101strumienia, 562

kosztalokacji, 249blokowania, 622utworzenia zasobu, 266

kowariancja, 151, 212kowariancja delegatów, 320

Poleć książkęKup książkę

Skorowidz � 827

kowariantny parametr typu, 213krotki, tuples, 204kszta�towanie danych, data

shaping, 368kwalifikator

ascending, 372descending, 372out, 127ref, 127

kwantyfikatoristnienia, Any, 375, 430ogólny, All, 375, 430

Llambda, 327leniwa inicjalizacja, lazy

initialization, 637liczba

argumentów, 169operacji, 176taktów, tick count, 77w�tków, 613wymiarów tablic, 179

liczby losowe, 174LIFO, last-in, first-out, 202LINQ, Language Integrated

Query, 21, 335operatory grupowania, 423operatory Join, 424

LINQ operators, 347LINQ provider, 347LINQ to Entities, 347, 362, 397LINQ to Events, 401LINQ to HPC, 369LINQ to Objects, 177, 347–386,

393–400LINQ to SQL, 347, 362, 398LINQ to XML, 399lista, 185, 189, 719

FIFO, 201iVector<T>, 566List<T>, 183

listy po��czone, 202litera�y, 60logiczna warto�� wynikowa, 798logowanie, 811

��a�cuch

dziedziczenia, 208znaków, 786

��cza do widoku typów, 776��czenie

delegatów, 315list, 385obserwowalnych róde�, 432

MMAC, message authentication

code, 755magazyn podzespo�ów, 474manifest

podzespo�u, assemblymanifest, 466

wdro�enia, deploymentmanifest, 466

mechanizmDLR, 521dynamicznych

po�redników, 157generowania widoków,

view engines, 741odzwierciedlania, 495, 520odzyskiwania pami�ci, 28,

237, 241–244, 248–255, 342,793

Platform Invoke,Patrz P/Invoke

Razor, Patrz Razorserializacji, 558, 590szereguj�cy, scheduler, 442,

645, 661ControlScheduler, 442, 445CoreDispatcherScheduler,

442, 445CurrentThreadScheduler,

443DispatcherScheduler, 442,

445ImmediateScheduler, 443przekazywanie, 445sposoby okre�lania, 443SynchronizationContextSc

heduler, 442, 445trasowania, 777wczytywania podzespo�ów,

463wspó�dzia�ania, 521

metadane, metadata, 465, 805,815

metadane .NET, 465metoda, 125

_Foo@12, 796

ActionLink, 777AddRef, 803Aggregate, 382AppednAllLines, 584Application_Start, 777Array.BinarySearch, 174Array.Clear, 182Array.Copy, 181Array.FindIndex, 310, 315Array.IndexOf, 171, 174Array.Sort, 174, 177Assembly, 773Assembly.CreateInstance, 509Assembly.Load, 474Assert, 68AsStreamForRead, 569AsStreamForWrite, 569BackupEventLog, 787BackupEventLogW, 787Base.Foo, 504BeginInvoke, 324BinarySearch, 173, 176BlockRead, 571CallDispose, 275Cancel, 652Cast<string>, 749Caught, 332Close, 564CoCreateInstance, 806, 815Compare, 154, 215CompareExchange, 634ConfigureAwait, 662Connect, 416Consol.WriteLine, 174Console.ReadKey, 62Console.WriteLine, 170Contact, 766Contains, 200ContainsKey, 197ContinueWith, 643, 650CopyTo, 181Create, 414CreateDelegate, 314, 322Derived.Foo, 504Dispose, 186, 193, 265–274,

564DownloadStringTaskAsync,

641, 646Encrypt, 582EndInvoke, 324EnsureInitialized, 638Enumerable.Repeat<T>, 397EnumerateFiles, 268

Poleć książkęKup książkę

828 � Skorowidz

metodaEnumWindows, 789Equals, 108, 218Exist, 582FailFast, 296File, 766Finalize, 218, 261FinAll, 364FindAll, 173, 330, 356FindIndex, 172, 310FindLongestLineAsync, 673Flush, 561, 571FormatDictionary, 602Frobnicate, 519FromCurrentSynchronization�Context, 646

FromEventPattern, 452, 454GetAccessControl, 578GetAwaiter, 670, 673, 679GetCallingAssembly, 499GetCultures, 356GetData, 606GetDetails, 620GetDirectoryName, 587GetDirectoryRoot, 586GetEnumerator, 186, 191GetExportedTypes, 500GetFileName, 587GetFolderPath, 589GetHashCode, 109, 198, 218GetHashCode.Equals, 108GetInfo, 197GetInvocationList, 323GetIsGreaterThanPredicate,

313GetLastWin32Error, 802GetLength, 181GetManifestResourceStream,

465GetNames, 234GetNextValue, 100, 103GetObjectData, 300GetPosition, 339GetResult, 669GetType, 218, 238, 273, 500GetTypeFromCLSID, 808GetValue, 122GroupJoin, 427IgnoreRoute, 778IndexOf, 177Initialize, 46InitializeComponent, 692

inline, 330int.TryParse, 280Interval, 457, 458Invoke, 324, 512InvokeMember, 509IsDefined, 553IsGreaterThan, 313, 329IsGreaterThanZero, 172, 310IsSupersetOf, 200Join, 427LoadFile, 499LoadFrom, 474LogPersistently, 629Main, 45, 98, 469MapRoute, 778Marshal.Release, 804Math.Sqrt, 62MemberwiseClone, 218Monitor.Enter, 623Monitor.Pulse, 624Monitor.Wait, 623Monitr.Exit, 622MoveNext, 186Notify, 606, 811object.ReferenceEquals, 105,

803Observable.Create, 416Observable.Empty<T>, 418Observable.FromAsync, 455Observable.FromEvent�Pattern, 452

Observable.Generate�<TState, TResult>, 420

Observable.Interval, 456Observable.Never<T>, 418Observable.Range, 419, 445Observable.Repeat<T>, 419Observable.Return<T>, 419Observable.Throw, 419Observable.Timer, 457ObserveOn, 444OnComplete, 345OnCompleted, 405, 410OnError, 345, 405, 410OnNext, 345, 412OrderBy, 372OrderByDescending, 372Overlap, 200Parallel.For, 653Parse, 234Path.Combine, 586Pop, 202

PrepareConstrainedRegions,307

Publish, 416Pulse, 624PulseAll, 624Push, 202QueryInterface, 806QueueUserWork, 611Read, 558, 560ReadLineAsync, 664, 673Redirect, 766ReferenceEquals, 218ReflectionOnlyGetType, 507RegisterRoutes, 778RegisterWaitForSingleObject,

630ReleaseHandle, 794ReleasseMutex, 633RemoveFirst, 202RemoveLast, 202Reset, 628Resize, 182RoCreateInstance, 815RoGetActivationFactory, 815Run, 413Seek, 561Select, 354SelectMany, 370SendAsync, 659Serialize, 593SetAccessControl, 578SetData, 606SetLastError, 802SetLength, 562SetMaxThreads, 613ShowMessage, 221SignalAndWait, 631Subscribe, 405, 412, 416SuppressFinalize, 264Task.Factory.StartNew, 641ThenBy, 373this.GetType, 759Thread.Sleep, 664ToEventPattern, 454ToObservable, 450, 455ToString, 217TrimExcess, 184TryEnter, 625TryGetValue, 197, 245, 280TryParse, 280Union, 382UseObjects, 519

Poleć książkęKup książkę

Skorowidz � 829

View, 766, 773Wait, 624, 676WaitAll, 630WaitOne, 631WhenAll, 650WhenAny, 650Where, 335, 354Write, 558WriteAsync, 651XmlReader.Create, 573

metodyabstrakcyjne, 222akcji, 766anonimowe, anonymous

method, 326, 819asynchroniczne, 657, 660cz��ciowe, 146globalne, 44inline, inline method, 326klasy

Directory, 585File, 582List<T>, 184object, 217

ogólne, generic methods,149, 160

ostateczne, sealed methods,228

rozszerze�, extensionmethods, 129

statyczne, 45, 815ukryte, 225warunkowe, conditional

methods, 68wirtualne, 220wytwórcze, factory method,

335z modyfikatorem async, 666zagnie�d�one, 667zwrotne, 669

mikropomiary,microbenchmarking, 174

modelAssemblyModel, 774kodu ukrytego, 753najwy�szego poziomu, 780programowania

asynchronicznego, APM,565

reprezentuj�cy podzespó�,769

wi�zania danych, 764widoku, viewmodel, 729

model-widok-prezenter, 729modu�y, modules, 466modyfikacja

przechwyconej zmiennej,330

tablic, 168modyfikator internal, 38modyfikatory dost�pno�ci, 97modyfikowanie

w�a�ciwo�ci, 132zawarto�ci obiektu, 133

monitory, 622MSDN, Microsoft Developer

Network Library, 547MTA, multithreaded apartment,

550muteksy, 633MVC, Model View Controller,

762domy�lny uk�ad strony, 768generowanie ��czy, 776kontrolery, 765modele, 767obs�uga danych

wej�ciowych, 774uk�ad projektu, 763, 765widoki, 767

Nnarz�dzie

Fakes, 157FxCop, 96ILDASM, 191msbuild, 31

nawiasyk�towe, 106, 149, 744klamrowe, 42, 55, 747kwadratowe, 167

nazwaklasy, 96punktu wej�cia, 797zmiennej, 56podzespo�u, 476, 487

nazwane potoki, named pipes,566

nazwyniewymawialne, 672zast�pcze, 42, 470

NET Core Profile, 488niebezpieczna sztuczka, 745niebezpieczny kod, 818

niejawnadelegacja instancji, 313konwersja, 208konwersja referencji, 214, 319

niejawnepakowanie, 273tworzenie delegatu, 312

numer wersji podzespo�u,480–483

Oobiekt, 238

AggregateException, 676CancellationTokenSource, 652CCW, 788ExpandoObject, 531FileInfo, 588FileStream, 409, 572IBuffer, 817IInputStream, 568IRandomAccessStream, 567KeyWatcher, 412Polyline, 428RCW, 788Request, 748SimpleColdSource, 408StorageFile, 568StringBuilder, 602StringReader, 573Task, 633Thread, 600TypeInfo, 499, 510

obiektyCOM, 814dynamiczne

niestandardowe, 528formatuj�ce, 593obserwowalne, 439programu Excel, 524RCW, 803skryptowe, scriptable

objects, 524stron, 748, 759wyj�tków, 286zdarze�, 628

obs�ugaanulowania, 653b��dów, 409, 415, 647, 672b��dów Win32, 802dzia�a� asynchronicznych,

599dzia�a� wspó�bie�nych, 639

Poleć książkęKup książkę

830 � Skorowidz

obs�uga�a�cuchów znaków, 786, 797modelu TypeModel, 775operacji asynchronicznych,

429powiadomie� ze skryptu,

812przep�ywu danych, 654Unicode, 787warto�ci HRESULT, 800widoków, 763wielow�tkowo�ci, 618, 634,

637wyj�tków, 285, 289, 673wyra�e� zapyta�, 353zdarze�, 337, 340, 632, 694

oddzielona prezentacja,separated presentation, 729

odwo�anie do projektu, 35odwzorowanie, map, 368odzwierciedlanie, reflection, 495odzyskiwanie pami�ci, GC, 28,

237, 241–244, 248–255, 260,342, 793

ograniczenia typu, 153dynamic, 526, 531referencyjnego, 155warto�ciowego, 157

oknoAdd View, 771Exceptions, 304New Project, 34projektu MVC, 764przesuwane, 434Reference Manager, 35

okrajanie, slicing, 207okre�lanie

klasy bazowej, 207typów, 517typu delegatu, 533w�a�ciwo�ci DataContext, 730

opakowywanie�a�cucha znaków, 573typu referencyjnego, 272zdarze�, 452, 453ród�a, 451

opcjaAdd Reference, 760Embedded Resource, 465Find All References, 143References, 42, 471Resource File, 485Start Debugging, 45

Start Without Debugging, 45

opcjekontynuacji, 644tworzenia zada�, 641

operacjeasynchroniczne, 565, 663, 678bez blokowania, 636na zbiorach, 384odzwierciedlania, 554równoleg�e, 677wej�cia-wyj�cia, 614, 657wspó�bie�ne, 653, 677z uzale�nieniami

czasowymi, 456operandy, 60operator, 135

>=, 136|, 135||, 135!=, 108&, 135, 818&&, 135., 138??, 138+, 54, 136++, 102+=, 136==, 105, 108>, 136

Aggregate, 369, 438, 440All, 375Amb, 441Any, 374as, 209AsEnumerable<T>, 394AsQueryable<T>, 394Avarage, 379Buffer, 433, 439

dzielenie s�ów, 440okna czasowe, 434, 460wyg�adzanie wyników, 435

Concat, 384, 385, 431Contains, 374Count, 374DefultIfEmpty<T>, 379Delay, 461DelaySubscription, 461Distinct, 384DistinctUntilChanged, 442ElementAt, 377ElementAtOrDefault, 377Except, 384false, 138First, 376FirstOrDefault, 376

GroupBy, 388GroupJoin, 392, 423, 428Intersect, 384is, 209Join, 390, 426Last, 377LastOrDefault, 377LongCount, 374Max, 380Merge, 432Min, 380new, 98, 103null coalescing, 85OfType<T>, 365, 393Reverse, 385Sample, 460Scan, 440Select, 366, 422, 431SelectMany, 369, 371, 429SequenceEqual, 385Single, 375SingleOrDefault, 376Skip, 378, 383SkipWhile, 378Sum, 379Take, 378TakeWhile, 379ThenBy, 361Throttle, 459Timeout, 460Timestamp, 459ToArray, 375ToDictionary, 394ToList, 375ToLookup, 394trójargumentowy, 84true, 138typeof, 506, 734Union, 384Where, 358, 364, 422Window, 433

sekwencjaobserwowalna, 439

wyg�adzanie, 437operator Zip, 385operatory

agreguj�ce, 430arytmetyczne, 82bitowe, 82konwersji, 136LINQ, 186, 347, 395, 422, 749logiczne, 83okien czasowych, 460przypisania z�o�one, 86

Poleć książkęKup książkę

Skorowidz � 831

operatoryrelacyjne, 84zwracaj�ce jedn� warto��, 430

opónione podpisywanie,delay sign, 478

opró�nianie strumienia, 561optymalizacja kompilatora JIT,

498ostrze�enie, warning, 225

PP/Invoke

b��dy Win32, 802konwencje wywo�a�, 796�a�cuch znaków, 797punkt wej�cia, 797

pakiet.xap, 525Office, 523, 809

pakowanie, boxing, 141, 272pakowanie danych typu

Nullable<T>, 276pami��

lokalna w�tku, 604podr�czna podzespo�ów,

474panel

Canvas, 703DockPanel, 710Grid, 705, 710Solution Explorer, 32, 35StackPanel, 703, 708, 714Test Explorer, 39Unit Test Explorer, 39, 45WrapPanel, 711

paneleWindows Runtime, 709WPF, 710XAML, 702

Parallel LINQ, 399, 654parametry typu, 149p�dzel, brush, 737p�tla

@foreach, 779do, 91for, 92foreach, 93, 269, 745while, 91, 269

piaskownica, sandbox, 22, 491pisanie

kontrolerów, 772modeli, 769widoków, 771

Platform Invoke, 795platforma

MapReduce, 369Windows Forms, 491WPF, 491

plik_Layout.cshtml, 767_PageStart.cshtml, 761_ViewStart.cshtml, 767About.cshtml, 767App.config, 166, 254App.xaml, 733AssemblyInfo.cs, 97, 538, 540Contact.cshtml, 767global.asax, 303Global.asax, 777Global.asax.cs, 762Index.cshtml, 767kodu ukrytego, 691mscorlib, 479Page.aspx.cs, 759RouteConfig.cs, 777StandardStyles.xaml, 739Type.cshtml, 775UnitText1.cs, 37web.config, 254

pliki.appx, 490.appxsym, 490.appxupload, 490.aspx, 741, 752, 763.cshtml, 741.csproj, 31, 34, 743.dll, 31.exe, 31, 464.msi, 491.resx, 484.sln, 32.suo, 32.vbhtml, 741.vcxproj, 31.winmd, 815.xap, 492.zip, 492bitmap, 736CSS, 751nag�ówkowe C++, 819PE, 465XAML, 287XML, 491zasobów, 486

pobieranieatrybutów, 553, 555obiektu Type, 506

strony WWW, 663wyniku zadania, 643z obiektu podzespo�u, 500zasobów, 485

podsystem POSIX, 467podzespo�y, 463

Global Assembly Cache, 474hybrydowe, 488identyfikator kulturowy, 484klucze silnych nazw, 478nazwa prosta, 476nazwa silna, 476numer wersji, 480okre�lanie architektury, 488wczytywanie, 471, 473wspó�dzia�ania, interop

assembly, 809zabezpieczenia, 493

podzespó�, assembly, 463ComparerLib, 471Microsoft.CSharp, 525mscorlib, 468

podzia� sterty, 250pojemno�� listy, 183pola, 115pole

niestatyczne, 99statyczne, 99

porównywaniereferencji, 104warto�ci, 105

porz�dekbig-endian, 784little-endian, 784

poszukiwanie wyj�tków, 677powiadomienia o zmianach

w�a�ciwo�ci, 731powinowactwo do w�tku,

thread affinity, 550, 614poziomy dost�pu

chroniony, protected, 219chroniony wewn�trzny,

protected internal, 219prywatny, private, 218publiczny, public, 218wewn�trzny, internal, 219

preambu�a, 577predykat, predicate, 310priorytet operatorów, 64procedura obs�ugi zdarze�, 694procesy, 792program

Excel, 523ILDASM, 815

Poleć książkęKup książkę

832 � Skorowidz

programsn, 478, 544TLBIMP, 808

programowanieasynchroniczne, 30, 325obiektowe, 95w oparciu o testy, 35

projekcjaelementów, 387lambda, 431

projekcje, 368projektant XAML, XAML

designer, 698promowanie, 75propagacja zdarze�, event

bubbling, 340protokó� OData, 398prywatna klasa zagnie�d�ona,

139przechodzenie

do ko�ca instrukcji, 90pomi�dzy sekcjami, 90

przechwytywaniemyszy, 422warto�ci licznika, 333zmiennych, 332

przeci��anie metod, 128przegl�danie kolekcji, 93przekazywanie argumentów

przez referencj�, 126przekroczenie zakresu, 77przekszta�canie

sygnatur, 799wyników zapytania, 368

przeno�ne biblioteki klas, 488przepe�nienie danych, 77przes�anianie metod

wirtualnych, 221przestrzenie nazw, namespace,

40XAML, 689XML, 689zagnie�d�one, 43

przestrze� deklaracji,declaration scope, 57

przestrze� nazwMicrosoft.Phone.Reactive,

404System, 40System.Collections.

Concurrent, 203, 639System.Collections.Generics,

185

System.ComponentModel.DataAnnotations, 772

System.Core, 42System.Diagnostics, 68, 174System.Globalization, 296System.IO, 41System.Linq, 354System.Numerics, 79System.Reactive, 404System.Reactive.Linq, 443,

454System.Reflection, 495System.Runtime.

CompilerServices, 672System.Text, 41System.Threading.Tasks.

Dataflow, 655System.Transactions, 604System.Web, 42System.Web.UI, 759System.Windows, 132Windows.Storage, 589Windows.UI.Xaml.Controls,

689, 714przeszukiwanie tablicy, 171przetwarzanie

bloku instrukcji lock, 622elementów, 421kolekcji, 94operandów, 64opónione, 357wyra�e�, 64

przypisanie, 63pude�ko, box, 141, 272pula w�tków, 609–616punkt

strumienia, 560wej�cia do programu, 38, 44,

98

RRazor, 741

bloki kodu, 746klasy i obiekty stron, 748sterowanie przep�ywem, 745stosowanie wyra�e�, 743strony pocz�tkowe, 751wskazywanie tre�ci, 747

RCW, runtime-callable wrapper,788

Reactive Extensions, 401

dostosowywanie róde�, 450funkcje w wersjach .NET,

403generowanie sekwencji, 418grupowanie zdarze�, 423interfejs IObservable<T>,

405, 450interfejs IObserver<T>, 406,

450mechanizmy szereguj�ce,

442model wypychania, 401obs�uga subskrybentów, 417operacje z uzale�nieniami

czasowymi, 456operatory, 431tematy, subjects, 447TPL, 454tworzenie zapyta� LINQ,

421tworzenie ród�a, 413zdarzenia .NET, 452ród�o zdarze�, 407

redukcja, reduce, 369, 383referencja, 101, 112

do zmiennej, 126this, 229typu object, 273

referencje g�ówne, rootreferences, 239

region wymuszonegowykonania, 306

regu�a precyzyjna, 781regu�y

dotycz�ce typów, 779wyranego przypisania, 54

rodzina, family, 507rozk�ad tekstu, 726rozszerzenia znaczników, 734

Binding, 735TemplateBinding, 734

równoleg�e obliczanie splotu,654

równoznaczno�� typów, typeequivalence, 810

rzutowanie, 75, 273obiektów, 523sekwencji, 393w dó�, 208

Poleć książkęKup książkę

Skorowidz � 833

Ssatelickie podzespo�y zasobów,

486scalanie sterty, 249, 256sekwencje, 185, 189, 396, 418semafory, 632serializacja, 545, 558, 590

CLR, 591danych, 28kontraktu danych, 594–597wyj�tku, 300

serwer IIS, 741Silverlight, 403, 446, 488, 524Silverlight dla Linuksa, 684sk�adanie, fold, 383sk�adowe, 97, 115

klasy Stream, 558prywatne, 115statyczne, 98typu delegatu, 323

skrypty, 811s�abe referencje, 244

d�ugie, 248krótkie, 247

s�owniki, 196, 597s�owniki posortowane, 198s�owo kluczowe

abstract, 222async, 415, 658, 667, 678await, 415, 430, 567, 643,

658–661, 667–678base, 230case, 89catch, 286checked, 77, 162class, 44, 97, 100const, 116default, 159delegate, 311, 326dynamic, 50, 519–524, 813else, 88enum, 141event, 337explicit, 136extern, 785, 795group, 387implicit, 137in, 349internal, 97, 493lock, 619, 622new, 165, 169, 226null, 55operator, 135

out, 126, 213override, 221, 225params, 169, 170partial, 146, 690private, 97public, 38, 97readonly, 101, 115ref, 126sealed, 228static, 66, 98, 125string, 469struct, 107, 157this, 100, 135throw, 292try, 286unchecked, 79unsafe, 818using, 564var, 52, 53virtual, 220void, 45where, 152while, 92yield, 190

solucja, solution, 32sondowanie, probing, 473sortowanie, 373sortowanie tablicy, 174sposoby kodowania, 574sprawdzanie warto�ci

HRESULT, 801SSCLI, Share Source CLI, 26sta�e, 116stan widoku, viewstate, 754standard

ECMA-335, 26IEEE 754, 72

statusy zada�, 642statyczny typ zmiennej, 51sterowanie przep�ywem, 87sterta, heap, 238, 248, 256stos, 201, 705stosowanie

atrybutu niestandardowego,552

puli w�tków, 615sposobów kodowania, 577stylów, 738szeregowania, 784

strona_PageStart.cshtml, 751nadrz�dna, master page, 760Page.aspx, 759

strony kodowe, 576strony uk�adu, layout pages, 749struktura DisposableValue, 274struktura wyra�enia, 61struktury, 102, 106, 790, 791struktury danych, 204strumienie, 557

aktualizowanie po�o�enia,560

d�ugo��, 562kopiowanie, 562obs�uga APM, 565obs�uga TAP, 565opró�nianie, 561typy, 565zwalnianie, 564

strumie�FileStream, 593StreamReader, 664

subskrybent, 416, 455subskrypcja

obserwowalnych róde�, 417zdarze�, 405

sygnatura metody delegatu,338

symbol@, 743DEBUG, 67TRACE, 67

symbole kompilacji, 67synchronizacja, 618szablon, template, 721

projektu MVC, 767szablony

C++, 161danych, 734danych, data template, 732kontrolek, 721

szeregowanie, marshaling, 784

Ttablica, 165, 792

byte[], 558CultureInfo[], 356Curse.Catalog, 366

tablicemieszaj�ce, hash table, 109nieregularne, 178prostok�tne, 180

TAP, Task-based AsynchronousPattern, 565

Poleć książkęKup książkę

834 � Skorowidz

technologiaClickOnce, 491COM, 521, 550, 798, 802

metadane, 805skrypty, 811

IntelliSense, 144LINQ, 130LINQ to Objects, 186Silverlight, 29TPL Dataflow, 653Web Forms, 752

tematy, subjects, 447termin

ASCII, 576Unicode, 574

testyjednostkowe, 37, 45, 729zawierania, 373

tokenfunkcji, function token, 323klucza publicznego, 476, 479metadanych, metadata

token, 293to�samo�� typu, 468TPL, Task Parallel Library, 30,

263, 325, 455, 610TPL Dataflow, 654transakcja otoczenia,

ambient transaction, 604trasa domy�lna, 781trasowanie, routing, 742, 777tryb serwerowy, 255tryby

odzyskiwania pami�ci, 254stacji roboczej, 254

tworzenieaplikacji internetowych, 741atrybutów, 536delegatu, 311dynamiczne obiektów, 501instancji klasy COM, 806, 808kolekcji asocjacyjnej, 394krotki, 204metod zwrotnych, 309obiektów, 230obiektów COM, 813obiektów Type, 509obiektu IBuffer, 816obiektu StreamWriter, 584odpowiednika metody

asynchronicznej, 660okien czasowych, 460plików Windows Inaller, 491

projektu, 33pude�ka, 273silnej nazwy, 478s�abych referencji, 247stron HTML, 742stron WWW, 741tablic, 165tablicy nieregularnej, 178typów warto�ciowych, 111w�tków, 608, 612ród�a, 414

typatrybutu, 551BigInteger, 79, 86BindingFlags, 502, 509bool, 80CancellationToken, 652Capture, 41Complex, 107, 114ConstructorInfo, 510EventHandler, 339Dictionary, 597dynamic, 519–527, 813

elementy HTML, 525mechanizmy

wspó�dzia�ania, 521ograniczenia, 526, 531–534

Enum, 234EventArgs, 338FileAccess, 579FileMode, 579FileOptions, 581IntPtr, 786, 793MethodBase, 510MethodInfo, 510MouseButtonEventArg, 339Nullable<T>, 106, 158, 276object, 81, 144opakowuj�cy, wrapper type,

106Rect, 383skonstruowany, constructed

type, 150string, 80System.Attribute, 235System.MulticastDelegate,

235System.Object, 217, 526System.ValueType, 234UnmanagedType, 788WeakReference, 245WeakReference<T>, 245zmiennej, 51

typowaniedynamiczne, 50, 518jawne, 518silne, 518s�abe, 518statyczne, 50, 518, 523

typyanonimowe, 53, 145, 367bazowe, 234CRT, 235cz��ciowe, 146kopiowalne, 785liczbowe, 71nale��ce do CLS, 72ogólne, generic types, 149,

211, 509referencyjne, 101, 111, 234statyczne, 517tablicowe, 166warto�ciowe, 106, 114, 234wyliczeniowe, 141, 144, 234,

502, 579, 788zagnie�d�one, 138zmiennoprzecinkowe, 72

Uuk�ad

marginesy, 698tekstu, 726szeroko�� i wysoko��, 700w�a�ciwo�ci, 696wype�nienia, 698wyrównanie, 697zdarzenia, 712

ukrywaniemetod, 225zmiennej, 57

Unicode, 51, 575, 787unieruchamianie

bloków pami�ci, 258tablicy, 819

uruchamianie CLR, 465us�ugi odzwierciedlania, 28ustawienia kulturowe, 486usuwanie

delegatów, 315obiektów, 239procedury obs�ugi zdarze�,

340

Poleć książkęKup książkę

Skorowidz � 835

VVBA, Visual Basic for

Applications, 522VES, Virtual Execution System,

26Visual Studio, 31, 463

Wwarstwy interfejsu

u�ytkownika, 730warto�ci, 112

domy�lne, 159logiczne, 80wynikowe, 798

warto��HRESULT, 799null, 276, 279pusta, nullable types, 138

w�tek sprz�towy, hardwarethread, 599

w�tkiCLR, 601pierwszoplanowe,

foreground threads, 609wbudowane typy danych, 70WCF, Windows Communication

Foundation, 347WCF Data Services, 397wczytywanie podzespo�ów,

assembly loader, 463, 471wdra�anie pakietów, 490Web Forms, 741, 752

bloki kodu, 758klasy i obiekty stron, 759kontrolki serwerowe, 752obiekty stron, 759strony nadrz�dne, 760wyra�enia, 758

WER, Windows ErrorReporting, 293

weryfikacjaargumentów, 674

iteratora, 193metody asynchronicznej,

675podpisu, 479��dania, 744

w�ze� References, 36wi�zanie

danych, data binding, 729dwukierunkowe, 731szablonów, 722

widokAssembly.cshtml, 773Index.cshtml, 767

widok-model, View-Model, 764wielow�tkowo��, 599wielow�tkowo�� wspó�bie�na,

600Windows 8, 490Windows Azure, 811Windows Phone, 403, 488, 686Windows Runtime, 456, 566, 686

bufor, 816dzia�anie klas, 815metadane, 815

Windows SDK, 787Windows Workflow

Foundation, 688WinRT, 23, 30w�a�ciwo�ci, 130

do��czane, attachableproperties, 693

kontrolek, 723obiektu strony, 748

w�a�ciwo��, 77AggregateException, 650automatyczna, 131CallStack, 287Cells, 523CurrentPhaseNumber, 632DateTime.Now, 458DeclaredProperties, 516DeclaredType, 504DefinedTypes, 496, 500EndOfStream, 284Environment.TickCount, 77Exception, 647FieldType, 513Filter, 344FusionLog, 472, 480GenericTypeArguments, 510HasDefaultValue, 512Headers, 749Height, 701HorizontalAlignment, 697HResult, 563InnerException, 294InnerExceptions, 647IsAlive, 247IsCompleted, 669IsGenericTypeDefinition,

510IsNestedFamANDAssem,

507

IsNestedFamily, 507IsPasswordRevealButton�Enablel, 728

Items, 720Layout, 750Length, 562Length tablicy, 166, 181LocalFolder, 589LongLength tablicy, 166Margin, 697–700Method, 322NewLine, 571ObjectForScripting, 811Orientation, 698Page.Title, 750Position, 558, 560ReflectedType, 504Result, 676Stretch, 736Target, 322TargetSite, 287Text, 726Timestamp, 458TotalHours, 380ViewBag, 767Width, 701Worksheets, 523zmiennego typu

warto�ciowego, 132WMF, Windows Media

Foundation, 737wnioskowanie typu, 52, 160WPF, Windows Presentation

Foundation, 42, 683wskanik, 28, 786, 818wskanik niezarz�dzany, 816wskaniki do funkcji, 789wstrzykiwanie zale�no�ci,

dependency injection, 132wtyczka Silverlight, 684wycieki pami�ci, 342wydajno�� dzia�ania programu,

549wyj�tek, exception, 279

AggregatedException, 673,676

AggregateException, 647ArgumentOutOfRange�Exception, 296

ArrayTypeMismatch�Exception, 216

COMException, 801DivideByZeroException, 285

Poleć książkęKup książkę

836 � Skorowidz

wyj�tek, exception,FileNotFoundException,

286, 301, 472, 588FormatException, 280IndexOutOfRangeException,

168, 287InvalidCastException, 209InvalidOperationException,

201, 297, 376IOException, 287, 562KeyNotFoundException, 197MarshalDirectiveException,

801MissingMethodException, 223NotImplementedException,

297NotSupportedException,

297, 560NullReferenceException, 83,

85, 276, 289, 336ObjectDisposedException,

267OutOfMemoryException,

191, 305OverflowException, 78RuntimBinderException, 519StackOverflowException,

305, 608System.OverflowException,

77ThreadAbortException, 305UnobservedTaskException,

678XamlParseException, 287XamlParseExeption, 303

wyj�tkiasynchroniczne, 285, 305COMException, 799nieobs�ugiwane, 301, 677niestandardowe, 298niezaobserwowane, 647pojedyncze, 675zg�aszane przez API, 282

wymuszanie odzyskiwaniapami�ci, 260

wypychanie, push, 401wyra�enia, 60

lambda, lambdaexpressions, 327, 335, 381,439, 610, 667

zakodowane, 758zapyta�, query expression,

347

wyra�enie@using, 749this(), 120

wyszukiwaniebinarne, 173, 176plików, 585

wy�wietlaniebitmap, 736filmów, 737komunikatu, 45tekstu, 725

wywo�ania zwrotne, 336, 345wywo�ywanie

delegatów, 316, 317finalizatora, 261funkcji Win32, 795metody, 38, 127, 509, 512

asynchronicznej, 660ogólnej, 160wirtualnej, 221

wzorce asynchroniczne, 456, 651wzorzec

APM, 651delegatów zdarze�, 338s�owa kluczowego await, 668

XXAML, 681–739

elementy podrz�dne, 692elementy w�a�ciwo�ci, 692grafika, 735klasy, 690kod ukryty, 690kontrolki, 713obs�uga zdarze�, 694panele, 702platformy, 682przestrzenie nazw, 689style, 738tekst, 725uk�ad, 696w�tki, 695wi�zanie danych, 729

XBAP, XAML browserapplication, 492

XML, 30

Zzabezpieczanie

dost�pu do danej, 626stanu, 619

zabieranie pracy, work stealing,612

zadania, 640bezw�tkowe, 641, 650bezw�tkowe

niestandardowe, 648nadrz�dne, 649podrz�dne, 649z�o�one, 650

zadaniowy wzorzecasynchroniczny, TAP, 565

zagnie�d�anieelementów, 692klas, 97

zagnie�d�one bloki try, 289zakleszczenie, 638zakres zmiennej, 55zamykanie uchwytów, 270, 564zapis do pliku, 572zapisywanie tablicy byte[], 817zapytania

LINQ, 348, 357, 421SQL, 336

zapytaniegrupuj�ce, 386–388opónione, 359

zasoby, 465zasoby Win32, 467zastosowanie wskaników, 818zawieranie typów

odzwierciedlania, 496zbiory, 200zbiór SortedSet, 201zdarzenia, events, 138, 336, 344,

628zdarzenia .NET, 452zdarzenie

Click, 615DispatcherUnhandled�Exception, 303

LayoutChanged, 712Loaded, 694MouseDown, 425MouseUp, 425PropertyChanged, 542, 732SendCompleted, 629SizeChanged, 713TextChanged, 694UnhandledException, 302UnobservedTaskException,

647zewn�trzna nazwa zast�pcza,

extern alias, 470

Poleć książkęKup książkę

Skorowidz � 837

zg�aszaniepowtórne wyj�tku, 292wyj�tku, 292

zgodno��delegatów, 320��cza z tras�, 779

ziarno, seed, 380z��czenia, 390z��czenie pogrupowane, 392zmienna, 50

fullUri, 240offset, 333treshold, 329zakresu, range variable, 349

zmiennelokalne, 50, 58typu dynamic, 519

typu referencyjnego, 106typy warto�ciowe, 132

znacznik kolejno�ci bajtów,BOM, 573

znaczniki asp:, 753znak

gwiazdki, 818minusa, 60

zwalnianieopcjonalne, 271strumieni, 564zasobów, 331

zwracanieobiektu Task, 666zadania Task<T>, 666

ród�a wyj�tków, 281ród�o

asynchroniczne, 415ciep�e, 407, 415, 429Rx, 405, 407zdarze�, 402zimne, 407, 415

���danie POST, 753, 755

Poleć książkęKup książkę

838 � Skorowidz

Poleć książkęKup książkę