Post on 05-Apr-2018
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: helion@helion.plWWW: 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ę
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ę