SlideShare ist ein Scribd-Unternehmen logo
1 von 95
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 1 / 61
Programowanie Komponentowe 
Wykład #7: Programowanie sterowane zdarzeniami 
Mikołaj Olszewski 
Wydział Zastosowan Informatyki i Matematyki 
Szkoły Głównej Gospodarstwa Wiejskiego 
25.11.2014 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 2 / 61
Plan wykładu 
1 Zdarzenia 
Delegaty 
Praca ze zdarzeniami 
2 Wywołania asynchroniczne 
Uproszczony model asynchroniczny 
Dostrajanie 
Tradycyjny model asynchroniczny 
Delegaty 
Programowanie asynchroniczne 
3 Podsumowanie 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 3 / 61
Wprowadzenie 
Zaawansowane programowanie komponentowe 
Pełniejsze wykorzystanie zasobów 
Wieksza skalowalnosc systemu 
Lepsza responsywnosc 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 4 / 61
Zdarzenia 
Plan wykładu 
1 Zdarzenia 
Delegaty 
Praca ze zdarzeniami 
2 Wywołania asynchroniczne 
Uproszczony model asynchroniczny 
Dostrajanie 
Tradycyjny model asynchroniczny 
Delegaty 
Programowanie asynchroniczne 
3 Podsumowanie 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 5 / 61
Zdarzenia 
Po co nam zdarzenia? 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 6 / 61
Zdarzenia 
Po co nam zdarzenia? 
Klient na obiekcie 
wywoływanie metod 
zmiana parametrów 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 7 / 61
Zdarzenia 
Po co nam zdarzenia? 
Klient na obiekcie 
wywoływanie metod 
zmiana parametrów 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 7 / 61
Zdarzenia 
Zdarzenia w .NET 
Natywne wsparcie dla zdarzen 
event 
dedykowane implementacje 
mechanizmy subskrypcji i publikacji 
Delegaty to podstawa 
referencja na metode / obiekt funkcyjny 
delegacja wywołania metody 
1 p u b l i c delegate void NumberChangedEventHandler ( i n t number 
) ; 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 8 / 61
Zdarzenia Delegaty 
Zródła i subskrybenci 
Zródło 
1 p u b l i c c l a s s MyPubl i she r 
2 f 
3 p u b l i c NumberChangedEventHandler NumberChanged ; 
4 / Po z o s t a l e metody i wl a s c iwo s c i / 
5 g 
Subskrybent 
1 p u b l i c c l a s s MySubs c r ibe r 
2 f 
3 p u b l i c void OnNumberChanged ( i n t number ) 
4 f 
5 s t r i n g message = ”Nowa wa r t o s c to ” + number ; 
6 MessageBox . Show(message , ”MySubs c r ibe r ” ) ; 
7 g 
8 g 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 9 / 61
Zdarzenia Delegaty 
Zródła i subskrybenci 
Zródło 
1 p u b l i c c l a s s MyPubl i she r 
2 f 
3 p u b l i c NumberChangedEventHandler NumberChanged ; 
4 / Po z o s t a l e metody i wl a s c iwo s c i / 
5 g 
Subskrybent 
1 p u b l i c c l a s s MySubs c r ibe r 
2 f 
3 p u b l i c void OnNumberChanged ( i n t number ) 
4 f 
5 s t r i n g message = ”Nowa wa r t o s c to ” + number ; 
6 MessageBox . Show(message , ”MySubs c r ibe r ” ) ; 
7 g 
8 g 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 9 / 61
Zdarzenia Delegaty 
Delegate 
1 p u b l i c a b s t r a c t c l a s s De l e g a t e : // l i s t a i n t e r f e j s o w 
2 f 
3 p u b l i c s t a t i c De l e g a t e Combine ( De l e g a t e a , De l e g a t e b ) ; 
4 p u b l i c s t a t i c De l e g a t e Remove ( De l e g a t e sour c e , De l e g a t e v a l u e ) ; 
5 p u b l i c o b j e c t DynamicInvoke ( o b j e c t [ ] a r g s ) ; 
6 p u b l i c v i r t u a l De l e g a t e [ ] Ge t I n v o c a t i o n L i s t ( ) ; 
7 // Po z o s t a l e skladowe 
8 g 
Lista delegowanych metod 
Operatory: =, +=, -= 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 10 / 61
Zdarzenia Delegaty 
Subskrypcja i publikacja 
1 MyPubl i she r p u b l i s h e r = new MyPubl i she r ( ) ; 
2 MySubs c r ibe r s u b s c r i b e r 1 = new MySubs c r ibe r ( ) ; 
3 MySubs c r ibe r s u b s c r i b e r 2 = new MySubs c r ibe r ( ) ; 
4 
5 p u b l i s h e r . NumberChanged += new NumberChangedEventHandler 
6 ( s u b s c r i b e r 1 . OnNumberChanged ) ; 
7 // i n f e r e n c j a d e l e g a t u 
8 p u b l i s h e r . NumberChanged += s u b s c r i b e r 2 . OnNumberChanged ; 
9 
10 p u b l i s h e r . NumberChanged ( 3 ) ; 
11 
12 p u b l i s h e r . NumberChanged −= s u b s c r i b e r 2 . OnNumberChanged ; 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 11 / 61
Zdarzenia Delegaty 
Generyczne delegaty I 
1 p u b l i c c l a s s MyClassT 
2 f 
3 p u b l i c d e l e g a t e void Ge n e r i cEv e n tHa n d l e r (T t ) ; 
4 p u b l i c void SomeMethod (T t ) 
5 f . . . g 
6 g 
1 MyClassint . Ge n e r i cEv e n tHa n d l e r d e l ; 
2 MyClassint ob j = new MyClassint ( ) ; 
3 d e l = o bj . SomeMethod ; 
4 // d e l = new MyClassi n t . Ge n e r i cEv e n tHa n d l e r ( ob j . SomeMethod ) ; 
5 d e l ( 3 ) ; 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 12 / 61
Zdarzenia Delegaty 
Generyczne delegaty I 
1 p u b l i c c l a s s MyClassT 
2 f 
3 p u b l i c d e l e g a t e void Ge n e r i cEv e n tHa n d l e r (T t ) ; 
4 p u b l i c void SomeMethod (T t ) 
5 f . . . g 
6 g 
1 MyClassint . Ge n e r i cEv e n tHa n d l e r d e l ; 
2 MyClassint ob j = new MyClassint ( ) ; 
3 d e l = o bj . SomeMethod ; 
4 // d e l = new MyClassi n t . Ge n e r i cEv e n tHa n d l e r ( ob j . SomeMethod ) ; 
5 d e l ( 3 ) ; 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 12 / 61
Zdarzenia Delegaty 
Generyczne delegaty II 
1 p u b l i c d e l e g a t e void Gene r i cEv entHandl e rT(T t ) ; 
2 
3 p u b l i c c l a s s MyClass 
4 f 
5 p u b l i c void SomeMethod ( i n t number ) 
6 f . . . g 
7 g 
8 
9 Gene r i cEv entHandl e rint d e l ; 
10 
11 MyClass ob j = new MyClass ( ) ; 
12 d e l = o bj . SomeMethod ; 
13 d e l ( 3 ) ; 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 13 / 61
Zdarzenia Delegaty 
event 
Delegaty wystarczajace 
Problem z delegatem 
Zalety event 
1 p u b l i c d e l e g a t e void NumberChangedEventHandler ( i n t number ) ; 
2 
3 p u b l i c c l a s s MyPubl i she r 
4 f 
5 p u b l i c event NumberChangedEventHandler NumberChanged ; 
6 p u b l i c void Fi r eEv e n t ( i n t number ) 
7 f 
8 NumberChanged ( number ) ; 
9 g 
10 g 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 14 / 61
Zdarzenia Delegaty 
event 
Delegaty wystarczajace 
Problem z delegatem 
Zalety event 
1 p u b l i c d e l e g a t e void NumberChangedEventHandler ( i n t number ) ; 
2 
3 p u b l i c c l a s s MyPubl i she r 
4 f 
5 p u b l i c event NumberChangedEventHandler NumberChanged ; 
6 p u b l i c void Fi r eEv e n t ( i n t number ) 
7 f 
8 NumberChanged ( number ) ; 
9 g 
10 g 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 14 / 61
Zdarzenia Delegaty 
Problemy 
Powtarzanie kodu dla kazdego zródła zdarzen 
Brak mozliwosci filtrowania zdarzen 
Zaleznosc od instancji zródła 
Wspólny czas zycia 
Łaczenie programowe 
Rozwiazania 
Loosely Coupled Events 
Message Queue 
Enterprise Service Bus 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 15 / 61
Zdarzenia Delegaty 
Problemy 
Powtarzanie kodu dla kazdego zródła zdarzen 
Brak mozliwosci filtrowania zdarzen 
Zaleznosc od instancji zródła 
Wspólny czas zycia 
Łaczenie programowe 
Rozwiazania 
Loosely Coupled Events 
Message Queue 
Enterprise Service Bus 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 15 / 61
Zdarzenia Praca ze zdarzeniami 
Sygnatura delegata 
Informacja jednokierunkowa 
1 p u b l i c d e l e g a t e void NumberChangedEventHandler ( i n t number ) ; 
Obsługa wielu zródeł 
1 p u b l i c d e l e g a t e void NumberChangedEventHandler 
2 ( o b j e c t s ende r , i n t number ) ; 
Uniezaleznienie zródła od subskrybenta 
1 p u b l i c d e l e g a t e void NumberChangedEventHandler 
2 ( o b j e c t s ende r , EventArgs e v entAr g s ) ; 
3 EventArgs . Empty 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 16 / 61
Zdarzenia Praca ze zdarzeniami 
Sygnatura delegata 
Informacja jednokierunkowa 
1 p u b l i c d e l e g a t e void NumberChangedEventHandler ( i n t number ) ; 
Obsługa wielu zródeł 
1 p u b l i c d e l e g a t e void NumberChangedEventHandler 
2 ( o b j e c t s ende r , i n t number ) ; 
Uniezaleznienie zródła od subskrybenta 
1 p u b l i c d e l e g a t e void NumberChangedEventHandler 
2 ( o b j e c t s ende r , EventArgs e v entAr g s ) ; 
3 EventArgs . Empty 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 16 / 61
Zdarzenia Praca ze zdarzeniami 
Sygnatura delegata 
Informacja jednokierunkowa 
1 p u b l i c d e l e g a t e void NumberChangedEventHandler ( i n t number ) ; 
Obsługa wielu zródeł 
1 p u b l i c d e l e g a t e void NumberChangedEventHandler 
2 ( o b j e c t s ende r , i n t number ) ; 
Uniezaleznienie zródła od subskrybenta 
1 p u b l i c d e l e g a t e void NumberChangedEventHandler 
2 ( o b j e c t s ende r , EventArgs e v entAr g s ) ; 
3 EventArgs . Empty 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 16 / 61
Zdarzenia Praca ze zdarzeniami 
Uzycie standardowego argumentu I 
1 p u b l i c d e l e g a t e void NumberChangedEventHandler 
2 ( o b j e c t s ende r , EventArgs e v entAr g s ) ; 
3 
4 p u b l i c c l a s s NumberChangedEventArgs : EventArgs 
5 f 
6 f . . . g 
7 p u b l i c i n t Number f ge t ; g 
8 g 
9 p u b l i c c l a s s MyPubl i she r 
10 f 
11 p u b l i c event NumberChangedEventHandler NumberChanged ; 
12 p u b l i c void FireNewNumberEvent ( EventArgs e v entAr g s ) 
13 f 
14 i f (NumberChanged != n u l l ) 
15 NumberChanged ( t h i s , e v entAr g s ) ; 
16 g 
17 g 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 17 / 61
Zdarzenia Praca ze zdarzeniami 
Uzycie standardowego argumentu II 
1 p u b l i c c l a s s MySubs c r ibe r 
2 f 
3 p u b l i c void OnNumberChanged 
4 ( o b j e c t s ende r , EventArgs e v entAr g s ) 
5 f 
6 NumberChangedEventArgs numberArg ; 
7 numberArg = e v entAr g s as NumberChangedEventArgs ; 
8 Debug . As s e r t ( numberArg != n u l l ) ; 
9 s t r i n g message = numberArg . Number ; 
10 MessageBox . Show( ”Nowy numer to ”+ message ) ; 
11 g 
12 g 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 18 / 61
Zdarzenia Praca ze zdarzeniami 
Standardowa obsługa zdarzen 
Wersja podstawowa 
1 p u b l i c d e l e g a t e void Ev entHandl e r 
2 ( o b j e c t s ende r , EventArgs e v entAr g s ) ; 
Wersja generyczna 
1 p u b l i c d e l e g a t e void EventHandlerE( o b j e c t s ende r , E e ) 
2 where E : EventArgs ; 
Wersja w pełni generyczna 
1 p u b l i c d e l e g a t e void Gene r i cEv entHandl e rT, E(T s ende r , E e ) 
2 where E : Ev ent sArgs ; 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 19 / 61
Zdarzenia Praca ze zdarzeniami 
Standardowa obsługa zdarzen 
Wersja podstawowa 
1 p u b l i c d e l e g a t e void Ev entHandl e r 
2 ( o b j e c t s ende r , EventArgs e v entAr g s ) ; 
Wersja generyczna 
1 p u b l i c d e l e g a t e void EventHandlerE( o b j e c t s ende r , E e ) 
2 where E : EventArgs ; 
Wersja w pełni generyczna 
1 p u b l i c d e l e g a t e void Gene r i cEv entHandl e rT, E(T s ende r , E e ) 
2 where E : Ev ent sArgs ; 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 19 / 61
Zdarzenia Praca ze zdarzeniami 
Standardowa obsługa zdarzen 
Wersja podstawowa 
1 p u b l i c d e l e g a t e void Ev entHandl e r 
2 ( o b j e c t s ende r , EventArgs e v entAr g s ) ; 
Wersja generyczna 
1 p u b l i c d e l e g a t e void EventHandlerE( o b j e c t s ende r , E e ) 
2 where E : EventArgs ; 
Wersja w pełni generyczna 
1 p u b l i c d e l e g a t e void Gene r i cEv entHandl e rT, E(T s ende r , E e ) 
2 where E : Ev ent sArgs ; 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 19 / 61
Zdarzenia Praca ze zdarzeniami 
Przechwytywanie wyjatków I 
1 p u b l i c c l a s s MyPubl i she r 
2 f 
3 p u b l i c event Ev entHandl e r MyEvent ; 
4 p u b l i c void Fi r eEv e n t ( ) 
5 f 
6 t r y 
7 f 
8 i f (MyEvent != n u l l ) 
9 MyEvent ( t h i s , EventArgs . Empty ) ; 
10 g 
11 catch 
12 f 
13 //Obsluga wy jatku 
14 g 
15 g 
16 g 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 20 / 61
Zdarzenia Praca ze zdarzeniami 
Przechwytywanie wyjatków II 
1 p u b l i c c l a s s MyPubl i she r 
2 f 
3 p u b l i c event Ev entHandl e r MyEvent ; 
4 p u b l i c void Fi r eEv e n t ( ) 
5 f 
6 i f (MyEvent == n u l l ) 
7 f 
8 r e t u r n ; 
9 g 
10 De l e g a t e [ ] d e l e g a t e s = MyEvent . Ge t I n v o c a t i o n L i s t ( ) ; 
11 f o r e a ch ( De l e g a t e d e l i n d e l e g a t e s ) 
12 f 
13 Ev entHandl e r s i n k = ( Ev entHandl e r ) d e l ; 
14 t r y 
15 f 
16 s i n k ( t h i s , EventArgs . Empty ) ; 
17 g 
18 catch 
19 f 
20 // o b s l u g a wy jatku 
21 g 
22 g 
23 g 
24 g 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 21 / 61
Zdarzenia Praca ze zdarzeniami 
EventsHelper 
1 p u b l i c s t a t i c c l a s s Ev e n t sHe l p e r 
2 f 
3 p u b l i c s t a t i c void F i r e ( De l e g a t e de l , params o b j e c t [ ] a r g s ) 
4 f 
5 i f ( d e l == n u l l ) 
6 f 
7 r e t u r n ; 
8 g 
9 De l e g a t e [ ] d e l e g a t e s = d e l . Ge t I n v o c a t i o n L i s t ( ) ; 
10 f o r e a ch ( De l e g a t e s i n k i n d e l e g a t e s ) 
11 f 
12 t r y 
13 f 
14 s i n k . DynamicInvoke ( a r g s ) ; 
15 g catch fg 
16 g 
17 g 
18 g 
1 us ing MyEventHandler = Gene r i cEv entHandl e rMyPublisher , 
NumberChangedEventArgs ; 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 22 / 61
Zdarzenia Praca ze zdarzeniami 
EventsHelper 
1 p u b l i c s t a t i c c l a s s Ev e n t sHe l p e r 
2 f 
3 p u b l i c s t a t i c void F i r e ( De l e g a t e de l , params o b j e c t [ ] a r g s ) 
4 f 
5 i f ( d e l == n u l l ) 
6 f 
7 r e t u r n ; 
8 g 
9 De l e g a t e [ ] d e l e g a t e s = d e l . Ge t I n v o c a t i o n L i s t ( ) ; 
10 f o r e a ch ( De l e g a t e s i n k i n d e l e g a t e s ) 
11 f 
12 t r y 
13 f 
14 s i n k . DynamicInvoke ( a r g s ) ; 
15 g catch fg 
16 g 
17 g 
18 g 
1 us ing MyEventHandler = Gene r i cEv entHandl e rMyPublisher , 
NumberChangedEventArgs ; 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 22 / 61
Zdarzenia Praca ze zdarzeniami 
Obsługa duzej liczby zdarzen I 
1 p u b l i c s e a l e d c l a s s Ev e n tHa n d l e r L i s t : IDi s p o s a b l e 
2 f 
3 p u b l i c Ev e n tHa n d l e r L i s t ( ) ; 
4 p u b l i c De l e g a t e t h i s [ o b j e c t key ] f ge t ; s e t ; g 
5 p u b l i c void AddHandler ( o b j e c t key , De l e g a t e v a l u e ) ; 
6 p u b l i c void AddHandlers ( Ev e n tHa n d l e r L i s t listToAddFrom ) ; 
7 p u b l i c void RemoveHandler ( o b j e c t key , De l e g a t e v a l u e ) ; 
8 p u b l i c v i r t u a l void Di spo s e ( ) ; 
9 g 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 23 / 61
Zdarzenia Praca ze zdarzeniami 
Obsługa duzej liczby zdarzen II 
1 us ing Cl i c kEv e n tHa n d l e r = Gene r i cEv entHandl e rMyButton , EventArgs; 
2 us ing MouseEventHandler = Gene r i cEv entHandl e rMyButton , MouseEventArgs; 
34 
p u b l i c c l a s s MyButton 
5 f 
6 Ev e n tHa n d l e r L i s t e v e n t L i s t ; 
7 p u b l i c MyButton ( ) 
8 f 
9 e v e n t L i s t = new Ev e n tHa n d l e r L i s t ( ) ; 
10 g 
11 p u b l i c event Cl i c kEv e n tHa n d l e r Cl i c k 
12 f 
13 add f e v e n t L i s t . AddHandler ( ” Cl i c k ” , v a l u e ) ; g 
14 remove f e v e n t L i s t . RemoveHandler ( ” Cl i c k ” , v a l u e ) ; g 
15 g 
16 p u b l i c event MouseEventHandler MouseMove 
17 f 
18 add f e v e n t L i s t . AddHandler ( ”MouseMove” , v a l u e ) ; g 
19 remove f e v e n t L i s t . RemoveHandler ( ”MouseMove” , v a l u e ) ; g 
20 g 
21 void F i r e C l i c k ( ) 
22 f 
23 Cl i c kEv e n tHa n d l e r h a n d l e r = e v e n t L i s t [ ” Cl i c k ” ] as Cl i c kEv e n tHa n d l e r ; 
24 Ev e n t sHe l p e r . F i r e ( handl e r , t h i s , EventArgs . Empty ) ; 
25 g 
26 void FireMouseMove (MouseButtons button , i n t c l i c k s , i n t x , i n t y , i n t d e l t a ) 
27 f 
28 MouseEventHandler h a n d l e r = e v e n t L i s t [ ”MouseMove” ] as MouseEventHandler ; 
29 MouseEventArgs a r g s = new MouseEventArgs ( button , c l i c k s , x , y , d e l t a ) ; 
30 Ev e n t sHe l p e r . F i r e ( handl e r , t h i s , a r g s ) ; 
31 g 
32 gMikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 24 / 61
Wywołania asynchroniczne 
Plan wykładu 
1 Zdarzenia 
Delegaty 
Praca ze zdarzeniami 
2 Wywołania asynchroniczne 
Uproszczony model asynchroniczny 
Dostrajanie 
Tradycyjny model asynchroniczny 
Delegaty 
Programowanie asynchroniczne 
3 Podsumowanie 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 25 / 61
Wywołania asynchroniczne 
Po co nam wywołania asynchroniczne? 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 26 / 61
Wywołania asynchroniczne 
Po co nam wywołania asynchroniczne? 
Blokowanie watku na wywołaniu metody 
długie działanie 
niewykorzystanie maszyny 
blokowanie GUI 
Remedium — natychmiastowy powrót 
Oddelegowanie zadania do działania „w tle” 
Poinformowanie o zakonczeniu działania „w tle” 
Korzysci 
poprawienie dostepnosci 
zwiekszenie przepustowosci 
polepszenie skalowalnosci 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
Wywołania asynchroniczne 
Po co nam wywołania asynchroniczne? 
Blokowanie watku na wywołaniu metody 
długie działanie 
niewykorzystanie maszyny 
blokowanie GUI 
Remedium — natychmiastowy powrót 
Oddelegowanie zadania do działania „w tle” 
Poinformowanie o zakonczeniu działania „w tle” 
Korzysci 
poprawienie dostepnosci 
zwiekszenie przepustowosci 
polepszenie skalowalnosci 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
Wywołania asynchroniczne 
Po co nam wywołania asynchroniczne? 
Blokowanie watku na wywołaniu metody 
długie działanie 
niewykorzystanie maszyny 
blokowanie GUI 
Remedium — natychmiastowy powrót 
Oddelegowanie zadania do działania „w tle” 
Poinformowanie o zakonczeniu działania „w tle” 
Korzysci 
poprawienie dostepnosci 
zwiekszenie przepustowosci 
polepszenie skalowalnosci 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
Wywołania asynchroniczne 
Po co nam wywołania asynchroniczne? 
Blokowanie watku na wywołaniu metody 
długie działanie 
niewykorzystanie maszyny 
blokowanie GUI 
Remedium — natychmiastowy powrót 
Oddelegowanie zadania do działania „w tle” 
Poinformowanie o zakonczeniu działania „w tle” 
Korzysci 
poprawienie dostepnosci 
zwiekszenie przepustowosci 
polepszenie skalowalnosci 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
Wywołania asynchroniczne 
Po co nam wywołania asynchroniczne? 
Blokowanie watku na wywołaniu metody 
długie działanie 
niewykorzystanie maszyny 
blokowanie GUI 
Remedium — natychmiastowy powrót 
Oddelegowanie zadania do działania „w tle” 
Poinformowanie o zakonczeniu działania „w tle” 
Korzysci 
poprawienie dostepnosci 
zwiekszenie przepustowosci 
polepszenie skalowalnosci 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
Wywołania asynchroniczne 
Po co nam wywołania asynchroniczne? 
Blokowanie watku na wywołaniu metody 
długie działanie 
niewykorzystanie maszyny 
blokowanie GUI 
Remedium — natychmiastowy powrót 
Oddelegowanie zadania do działania „w tle” 
Poinformowanie o zakonczeniu działania „w tle” 
Korzysci 
poprawienie dostepnosci 
zwiekszenie przepustowosci 
polepszenie skalowalnosci 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
Wywołania asynchroniczne 
Po co nam wywołania asynchroniczne? 
Blokowanie watku na wywołaniu metody 
długie działanie 
niewykorzystanie maszyny 
blokowanie GUI 
Remedium — natychmiastowy powrót 
Oddelegowanie zadania do działania „w tle” 
Poinformowanie o zakonczeniu działania „w tle” 
Korzysci 
poprawienie dostepnosci 
zwiekszenie przepustowosci 
polepszenie skalowalnosci 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
Wywołania asynchroniczne 
Po co nam wywołania asynchroniczne? 
Blokowanie watku na wywołaniu metody 
długie działanie 
niewykorzystanie maszyny 
blokowanie GUI 
Remedium — natychmiastowy powrót 
Oddelegowanie zadania do działania „w tle” 
Poinformowanie o zakonczeniu działania „w tle” 
Korzysci 
poprawienie dostepnosci 
zwiekszenie przepustowosci 
polepszenie skalowalnosci 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
Wywołania asynchroniczne 
Po co nam wywołania asynchroniczne? 
Blokowanie watku na wywołaniu metody 
długie działanie 
niewykorzystanie maszyny 
blokowanie GUI 
Remedium — natychmiastowy powrót 
Oddelegowanie zadania do działania „w tle” 
Poinformowanie o zakonczeniu działania „w tle” 
Korzysci 
poprawienie dostepnosci 
zwiekszenie przepustowosci 
polepszenie skalowalnosci 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
Wywołania asynchroniczne 
Po co nam wywołania asynchroniczne? 
Blokowanie watku na wywołaniu metody 
długie działanie 
niewykorzystanie maszyny 
blokowanie GUI 
Remedium — natychmiastowy powrót 
Oddelegowanie zadania do działania „w tle” 
Poinformowanie o zakonczeniu działania „w tle” 
Korzysci 
poprawienie dostepnosci 
zwiekszenie przepustowosci 
polepszenie skalowalnosci 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
Wywołania asynchroniczne 
Po co nam wywołania asynchroniczne? 
Blokowanie watku na wywołaniu metody 
długie działanie 
niewykorzystanie maszyny 
blokowanie GUI 
Remedium — natychmiastowy powrót 
Oddelegowanie zadania do działania „w tle” 
Poinformowanie o zakonczeniu działania „w tle” 
Korzysci 
poprawienie dostepnosci 
zwiekszenie przepustowosci 
polepszenie skalowalnosci 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
Wywołania asynchroniczne 
Wymagania dla mechanizmu wywołan asynchronicznych 
Mozliwosc wymiennego uzywania wywołan synchronicznych i 
asynchronicznych na komponencie 
Klient decyduje jakiego rodzaju wywołan chce uzywac 
Mozliwosc wywołania wielu asynchronicznych metod działajacych w 
tym samym czasie 
Mozliwosc dostepu do wyników wykonania metody asynchronicznej 
Wszystkie wyjatki w komponencie powinny zostac przekazane do 
klienta 
Prostota i wydajnosc uzywania 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 28 / 61
Wywołania asynchroniczne 
Działania asynchroniczne w .NET 
Wiele watków 
Nowe wywołanie — nowy watek 
.NET thread pool — całkowicie przezroczyste dla programisty 
Współprogramy (z ang. coroutines) 
Rózne modele programowania 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 29 / 61
Wywołania asynchroniczne 
Działania asynchroniczne w .NET 
Wiele watków 
Nowe wywołanie — nowy watek 
.NET thread pool — całkowicie przezroczyste dla programisty 
Współprogramy (z ang. coroutines) 
Rózne modele programowania 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 29 / 61
Wywołania asynchroniczne 
Działania asynchroniczne w .NET 
Wiele watków 
Nowe wywołanie — nowy watek nowe zadanie dla watku z puli 
.NET thread pool — całkowicie przezroczyste dla programisty 
Współprogramy (z ang. coroutines) 
Rózne modele programowania 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 29 / 61
Wywołania asynchroniczne 
Działania asynchroniczne w .NET 
Wiele watków 
Nowe wywołanie — nowy watek nowe zadanie dla watku z puli 
.NET thread pool — całkowicie przezroczyste dla programisty 
Współprogramy (z ang. coroutines) 
Rózne modele programowania 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 29 / 61
Wywołania asynchroniczne 
Działania asynchroniczne w .NET 
Wiele watków 
Nowe wywołanie — nowy watek nowe zadanie dla watku z puli 
.NET thread pool — całkowicie przezroczyste dla programisty 
Współprogramy (z ang. coroutines) 
Rózne modele programowania 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 29 / 61
Wywołania asynchroniczne 
Działania asynchroniczne w .NET 
Wiele watków 
Nowe wywołanie — nowy watek nowe zadanie dla watku z puli 
.NET thread pool — całkowicie przezroczyste dla programisty 
Współprogramy (z ang. coroutines) 
Rózne modele programowania 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 29 / 61
Wywołania asynchroniczne Uproszczony model asynchroniczny 
Model uproszczony 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 30 / 61
Wywołania asynchroniczne Uproszczony model asynchroniczny 
Model uproszczony 
Programowanie asynchroniczne jest wazne – UX 
Problem dla programistów 
Myslenie synchroniczne 
Automatyczna generacja kodu asynchronicznego 
z drobna pomoca programisty 
async i await 
Współprogramy 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 31 / 61
Wywołania asynchroniczne Uproszczony model asynchroniczny 
Metoda (a-)/synchroniczna 
1 i n t AccessTheWeb ( ) 
2 f 
3 Ht t pCl i e n t c l i e n t = 
4 new Ht t pCl i e n t ( ) ; 
5 
6 s t r i n g u r lCo n t e n t s = 
7 c l i e n t . Ge t S t r i n g ( ” ht tp 
: / / wzim . sggw . p l ” ) ; 
8 
9 DoIndependentWork ( ) ; 
10 
11 
12 
13 
14 r e t u r n u r lCo n t e n t s . Length ; 
15 g 
1 async Taskint AccessTheWebAsync ( ) 
2 f 
3 Ht t pCl i e n t c l i e n t = 
4 new Ht t pCl i e n t ( ) ; 
5 
6 Tasks t r i n g  g e t S t r i n gTa s k = 
7 c l i e n t . Ge tSt r i ngAs y n c ( ” ht tp 
: / / wzim . sggw . p l ” ) ; 
8 
9 DoIndependentWork ( ) ; 
10 
11 s t r i n g u r lCo n t e n t s = 
12 awai t g e t S t r i n gTa s k ; 
13 
14 r e t u r n u r lCo n t e n t s . Length ; 
15 g 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 32 / 61
Wywołania asynchroniczne Uproszczony model asynchroniczny 
Metoda (a-)/synchroniczna 
1 i n t AccessTheWeb ( ) 
2 f 
3 Ht t pCl i e n t c l i e n t = 
4 new Ht t pCl i e n t ( ) ; 
5 
6 s t r i n g u r lCo n t e n t s = 
7 c l i e n t . Ge t S t r i n g ( ” ht tp 
: / / wzim . sggw . p l ” ) ; 
8 
9 DoIndependentWork ( ) ; 
10 
11 
12 
13 
14 r e t u r n u r lCo n t e n t s . Length ; 
15 g 
1 async Taskint AccessTheWebAsync ( ) 
2 f 
3 Ht t pCl i e n t c l i e n t = 
4 new Ht t pCl i e n t ( ) ; 
5 
6 Tasks t r i n g  g e t S t r i n gTa s k = 
7 c l i e n t . Ge tSt r i ngAs y n c ( ” ht tp 
: / / wzim . sggw . p l ” ) ; 
8 
9 DoIndependentWork ( ) ; 
10 
11 s t r i n g u r lCo n t e n t s = 
12 awai t g e t S t r i n gTa s k ; 
13 
14 r e t u r n u r lCo n t e n t s . Length ; 
15 g 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 32 / 61
Wywołania asynchroniczne Uproszczony model asynchroniczny 
Przepływ sterowania 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 33 / 61
Wywołania asynchroniczne Uproszczony model asynchroniczny 
Zwracane typy 
TaskTResult 
Task 
void 
uzywane w procedurach obsługi zdarzen 
brak mozliwosci przechwytywania wyjatków 
jak w IDL-u . . . 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 34 / 61
Wywołania asynchroniczne Uproszczony model asynchroniczny 
Zwracane typy 
TaskTResult 
Task 
void 
uzywane w procedurach obsługi zdarzen 
brak mozliwosci przechwytywania wyjatków 
jak w IDL-u . . . 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 34 / 61
Wywołania asynchroniczne Uproszczony model asynchroniczny 
Zwracane typy 
TaskTResult 
Task 
void 
uzywane w procedurach obsługi zdarzen 
brak mozliwosci przechwytywania wyjatków 
jak w IDL-u . . . 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 34 / 61
Wywołania asynchroniczne Uproszczony model asynchroniczny 
Zwracane typy 
TaskTResult 
Task 
void 
uzywane w procedurach obsługi zdarzen 
brak mozliwosci przechwytywania wyjatków 
jak w IDL-u . . . 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 34 / 61
Wywołania asynchroniczne Uproszczony model asynchroniczny 
Zwracane typy 
TaskTResult 
Task 
void 
uzywane w procedurach obsługi zdarzen 
brak mozliwosci przechwytywania wyjatków 
jak w IDL-u . . . 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 34 / 61
Wywołania asynchroniczne Uproszczony model asynchroniczny 
Zwracane typy 
TaskTResult 
Task 
void 
uzywane w procedurach obsługi zdarzen 
brak mozliwosci przechwytywania wyjatków 
jak w IDL-u . . . 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 34 / 61
Wywołania asynchroniczne Uproszczony model asynchroniczny 
Watki 
Współprogramy 
jeden watek 
ten sam kontekst synchronizacji 
brak „aktywnego czekania” — zwalnianie zasobów 
Przeniesienie działania do oddzielnego watku („w tle”) 
Task.Run 
działanie w puli watków 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 35 / 61
Wywołania asynchroniczne Uproszczony model asynchroniczny 
Watki 
Współprogramy 
jeden watek 
ten sam kontekst synchronizacji 
brak „aktywnego czekania” — zwalnianie zasobów 
Przeniesienie działania do oddzielnego watku („w tle”) 
Task.Run 
działanie w puli watków 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 35 / 61
Wywołania asynchroniczne Uproszczony model asynchroniczny 
Anulowanie zadania I 
1 Ca n c e l l a t i o nTo k e nSo u r c e c t s ; 
2 
3 . . . 
4 
5 p r i v a t e async void s t a r tBu t t o n C l i c k ( o b j e c t s , RoutedEventArgs e ) 
6 f 
7 c t s = new Ca n c e l l a t i o nTo k e nSo u r c e ( ) ; 
8 t r y 
9 f 
10 i n t c ont entLeng th = awai t AccessTheWebAsync ( c t s . Token ) ; 
11 g 
12 catch ( Op e r a t i o nCa n c e l e dEx c e p t i o n ) 
13 f 
14 . . . 
15 g 
16 catch ( Ex c e p t i o n ) 
17 f 
18 . . . 
19 g 
20 c t s = n u l l ; 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 36 / 61
Wywołania asynchroniczne Uproszczony model asynchroniczny 
Anulowanie zadania II 
21 g 
22 
23 p r i v a t e void c a n c e lBu t t o n Cl i c k ( o b j e c t s ende r , RoutedEventArgs e ) 
24 f 
25 i f ( c t s != n u l l ) 
26 c t s . Canc e l ( ) ; 
27 // c t s . Ca n c e lAf t e r (2500) ; 
28 g 
29 
30 async Taskint AccessTheWebAsync ( Ca n c e l l a t i o nTo k e n c t ) 
31 f 
32 . . . 
33 HttpResponseMessage r e s p o n s e = 
34 awai t c l i e n t . GetAsync ( ” ht tp : / / wzim . sggw . p l ” , c t ) ; 
35 . . . 
36 g 
CancellationToken 
IsCancellationRequested 
ThrowIfCancellationRequested() 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 37 / 61
Wywołania asynchroniczne Uproszczony model asynchroniczny 
Lista zadan asynchronicznych I 
1 async Taskint ProcessURLAsync ( s t r i n g u r l , Ht t pCl i e n t c l i e n t , 
Ca n c e l l a t i o nTo k e n c t ) 
2 f 
3 HttpResponseMessage r e s p o n s e = awai t c l i e n t . GetAsync ( u r l , c t ) ; 
4 byte [ ] u r lCo n t e n t s = awai t r e s p o n s e . Content . ReadAsByteArrayAsync 
( ) ; 
5 r e t u r n u r lCo n t e n t s . Length ; 
6 g 
7 
8 async Task AccessTheWebAsync ( Ca n c e l l a t i o nTo k e n c t ) 
9 f 
10 Ht t pCl i e n t c l i e n t = new Ht t pCl i e n t ( ) ; 
11 L i s t s t r i n g  u r l L i s t = new L i s t s t r i n g  
12 f 
13 ” ht tp : / / wzim . sggw . p l ” , 
14 ” ht tp : / / demotywatory . p l ” , 
15 . . . 
16 g 
17 
18 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 38 / 61
Wywołania asynchroniczne Uproszczony model asynchroniczny 
Lista zadan asynchronicznych II 
19 IEnumerableTaskint downloadTasksQuery = 
20 from u r l i n u r l L i s t s e l e c t ProcessURLAsync ( u r l , c l i e n t , c t ) ; 
21 
22 Taskint [] downloadTasks = downloadTasksQuery . ToArray ( ) ; 
23 // L i s t Taski n t downloadTasks = downloadTasksQuery . ToLi s t ( ) ; 
24 
25 Taskint f i r s t F i n i s h e d T a s k = awai t Task .WhenAny ( downloadTasks ) ; 
26 c t s . Canc e l ( ) ; 
27 // downloadTasks . Remove ( f i r s t F i n i s h e d T a s k ) ; 
28 var l e n g t h = awai t f i r s t F i n i s h e d T a s k ; 
29 
30 // i n t [ ] l e n g t h s = awa i t Task . WhenAll ( downloadTasks ) ; 
31 
32 . . . 
33 g 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 39 / 61
Wywołania asynchroniczne Uproszczony model asynchroniczny 
Podsumowanie modelu uproszczonego 
Myslenie synchroniczne + słowa kluczowe 
Współprogramy z ew. delegacja zadan do watków „w tle” 
Operowanie na pojedynczym zadaniu lub kolekcji zadan 
Asynchroniczne procedury obsługi zdarzen 
Uwazac na wielokrotne uruchamianie tych samych zadan 
asynchronicznych 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 40 / 61
Wywołania asynchroniczne Tradycyjny model asynchroniczny 
Model tradycyjny 
Oparty na delegatach 
Wywołania zwrotne 
Zadania realizowane w puli watków 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 41 / 61
Wywołania asynchroniczne Tradycyjny model asynchroniczny 
Delegaty raz jeszcze I 
1 p u b l i c c l a s s C a l c u l a t o r 
2 f 
3 p u b l i c i n t Add ( i n t argument1 , i n t argument2 ) 
4 f 
5 r e t u r n argument1 + argument2 ; 
6 g 
7 p u b l i c i n t Sub ( i n t argument1 , i n t argument2 ) 
8 f 
9 r e t u r n argument1 − argument2 ; 
10 g 
11 g 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 42 / 61
Wywołania asynchroniczne Tradycyjny model asynchroniczny 
Delegaty raz jeszcze II 
1 p u b l i c d e l e g a t e i n t Bi n a r yOp e r a t i o n ( i n t argument1 , i n t argument2 ) ; 
2 
3 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 
4 Bi n a r yOp e r a t i o n oppDel = c a l c u l a t o r . Add ; 
5 i n t r e s u l t = 0 ; 
6 r e s u l t = oppDel ( 2 , 3 ) ; 
7 Debug . As s e r t ( r e s u l t == 5) ; 
Blokowanie do czasu wykonania Add(...) 
Istnieje mozliwosc wywołania asynchronicznego 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 43 / 61
Wywołania asynchroniczne Tradycyjny model asynchroniczny 
Asynchronicznosc w delegatach 
1 p u b l i c s e a l e d c l a s s Bi n a r yOp e r a t i o n : Mu l t i c a s tDe l e g a t e 
2 f 
3 p u b l i c Bi n a r yOp e r a t i o n ( Obj e c t t a r g e t , i n t methodPtr ) 
4 f . . . g 
5 p u b l i c v i r t u a l i n t I n v o k e ( i n t argument1 , i n t argument2 ) 
6 f . . . g 
7 p u b l i c v i r t u a l IAs y n cRe s u l t Be g inInv o k e ( i n t argument1 , 
8 i n t argument2 , 
9 As yncCa l lba c k c a l l b a c k , 
10 o b j e c t a s y n cSt a t e ) 
11 f . . . g 
12 p u b l i c v i r t u a l i n t EndInvoke ( IAs y n cRe s u l t r e s u l t ) 
13 f . . . g 
14 g 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 44 / 61
Wywołania asynchroniczne Tradycyjny model asynchroniczny 
BeginInvoke i EndInvoke 
IAsyncResult BeginInvoke(..., AsyncCallback callback, 
object asyncState) 
takie same parametry 
callback (mozliwy null) 
asyncState (mozliwy null) 
zwraca uchwyt do operacji asynchronicznej 
... EndInvoke(..., IAsyncResult asyncResult) 
takie same parametry wyjsciowe + asyncResult 
zwraca to samo 
1 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 
2 Bi n a r yOp e r a t i o n oppDel = c a l c u l a t o r . Add ; 
3 oppDel . Be g inInv o k e ( 2 , 3 , n u l l , n u l l ) 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 45 / 61
Wywołania asynchroniczne Tradycyjny model asynchroniczny 
BeginInvoke i EndInvoke 
IAsyncResult BeginInvoke(..., AsyncCallback callback, 
object asyncState) 
takie same parametry 
callback (mozliwy null) 
asyncState (mozliwy null) 
zwraca uchwyt do operacji asynchronicznej 
... EndInvoke(..., IAsyncResult asyncResult) 
takie same parametry wyjsciowe + asyncResult 
zwraca to samo 
1 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 
2 Bi n a r yOp e r a t i o n oppDel = c a l c u l a t o r . Add ; 
3 oppDel . Be g inInv o k e ( 2 , 3 , n u l l , n u l l ) 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 45 / 61
Wywołania asynchroniczne Tradycyjny model asynchroniczny 
BeginInvoke i EndInvoke 
IAsyncResult BeginInvoke(..., AsyncCallback callback, 
object asyncState) 
takie same parametry 
callback (mozliwy null) 
asyncState (mozliwy null) 
zwraca uchwyt do operacji asynchronicznej 
... EndInvoke(..., IAsyncResult asyncResult) 
takie same parametry wyjsciowe + asyncResult 
zwraca to samo 
1 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 
2 Bi n a r yOp e r a t i o n oppDel = c a l c u l a t o r . Add ; 
3 oppDel . Be g inInv o k e ( 2 , 3 , n u l l , n u l l ) 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 45 / 61
Wywołania asynchroniczne Tradycyjny model asynchroniczny 
IAsyncResult 
1 p u b l i c i n t e r f a c e IAs y n cRe s u l t 
2 f 
3 o b j e c t As yncSt a t e f ge t ; g 
4 WaitHandle AsyncWaitHandle f ge t ; g 
5 bool Compl e t edSynchronous l y f ge t ; g 
6 bool I sCompl e t ed f ge t ; g 
7 g 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 46 / 61
Wywołania asynchroniczne Tradycyjny model asynchroniczny 
Uzycie asynchronicznosci 
1 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 
2 Bi n a r yOp e r a t i o n oppDel = c a l c u l a t o r . Add ; 
3 
4 IAs y n cRe s u l t a s y n cRe s u l t 1 = oppDel . Be g inInv o k e ( 2 , 3 , n u l l , n u l l ) ; 
5 IAs y n cRe s u l t a s y n cRe s u l t 2 = oppDel . Be g inInv o k e ( 4 , 5 , n u l l , n u l l ) ; 
6 
7 / j a k a s pr a c a / 
8 
9 i n t r e s u l t ; 
10 
11 // blok ada do c z a su z a k o n c z e n i a o p e r a c j i 
12 r e s u l t = oppDel . EndInvoke ( a s y n cRe s u l t 1 ) ; 
13 Debug . As s e r t ( r e s u l t == 5) ; 
14 
15 // blok ada do c z a su z a k o n c z e n i a o p e r a c j i 
16 r e s u l t = oppDel . EndInvoke ( a s y n cRe s u l t 2 ) ; 
17 Debug . As s e r t ( r e s u l t == 9) ; 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 47 / 61
Wywołania asynchroniczne Tradycyjny model asynchroniczny 
Podstawowe reguły 
EndInvoke() tylko raz dla operacji 
inaczej InvalidOperationException 
Tylko jeden element na liscie delegatów 
inaczej ArgumentException 
IAsyncResult do odpowiedniego EndInvoke() 
inaczej InvalidOperationException 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 48 / 61
Wywołania asynchroniczne Tradycyjny model asynchroniczny 
AsyncResult 
1 p u b l i c c l a s s As yncRe sul t : IAs y n cRe s u l t , IMe s s ageSink 
2 f 
3 // impl ement a c j a IAs y n cRe s u l t 
4 p u b l i c v i r t u a l o b j e c t As yncSt a t e f ge t ; g 
5 p u b l i c v i r t u a l WaitHandle AsyncWaitHandle f ge t ; g 
6 p u b l i c v i r t u a l bool Compl e t edSynchronous l y f ge t ; g 
7 p u b l i c v i r t u a l bool I sCompl e t ed f ge t ; g 
8 
9 // p o z o s t a l e wl a s c iwo s c i 
10 p u b l i c bool En d I n v o k eCa l l e d f ge t ; s e t ; g 
11 p u b l i c v i r t u a l o b j e c t As yncDe l ega t e f ge t ; g 
12 
13 . . . 
14 g 
namespace 
System.Runtime.Remoting.Messaging 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 49 / 61
Wywołania asynchroniczne Tradycyjny model asynchroniczny 
Uzycie AsyncResult 
1 p u b l i c c l a s s C a l c u l a t o r C l i e n t 
2 f 
3 IAs y n cRe s u l t a s y n cRe s u l t ; 
45 
p u b l i c void AsyncAdd ( ) 
6 f 
7 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 
8 DispatchAdd ( c a l c u l a t o r , 2 , 3 ) ; 
9 / j a k a s pr a c a / 
10 i n t r e s u l t = Ge tRe s u l t ( ) ; 
11 Debug . As s e r t ( r e s u l t == 5) ; 
12 g 
13 void DispatchAdd ( C a l c u l a t o r c a l c u l a t o r , i n t number1 , i n t number2 ) 
14 f 
15 Bi n a r yOp e r a t i o n oppDel = c a l c u l a t o r . Add ; 
16 a s y n cRe s u l t = oppDel . Be g inInv o k e ( 2 , 3 , n u l l , n u l l ) ; 
17 g 
18 i n t Ge tRe s u l t ( ) 
19 f 
20 i n t r e s u l t = 0 ; 
21 
22 As yncRe sul t a s y n cRe s u l t = ( As yncRe sul t ) a s y n cRe s u l t ; 
23 Bi n a r yOp e r a t i o n oppDel = ( Bi n a r yOp e r a t i o n ) a s y n cRe s u l t . As yncDe l ega t e ; 
24 
25 Debug . As s e r t ( a s y n cRe s u l t . En d I n v o k eCa l l e d == f a l s e ) ; 
26 r e s u l t = oppDel . EndInvoke ( a s y n cRe s u l t ) ; 
27 r e t u r n r e s u l t ; 
28 g 
29 g 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 50 / 61
Wywołania asynchroniczne Tradycyjny model asynchroniczny 
Blokowanie 
1 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 
2 Bi n a r yOp e r a t i o n oppDel = c a l c u l a t o r . Add ; 
3 
4 IAs y n cRe s u l t a s y n cRe s u l t = oppDel . Be g inInv o k e ( 2 , 3 , n u l l , n u l l ) ; 
5 
6 / j a k a s pr a c a / 
7 
8 a s y n cRe s u l t . AsyncWaitHandle .WaitOne ( ) ; //mozliwa blok ada 
9 
10 i n t r e s u l t ; 
11 r e s u l t = oppDel . EndInvoke ( a s y n cRe s u l t ) ; // bez bl ok ady 
12 Debug . As s e r t ( r e s u l t == 5) ; 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 51 / 61
Wywołania asynchroniczne Tradycyjny model asynchroniczny 
Sprawdzanie dostepnosci 
1 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 
2 Bi n a r yOp e r a t i o n oppDel = c a l c u l a t o r . Add ; 
3 
4 IAs y n cRe s u l t a s y n cRe s u l t = oppDel . Be g inInv o k e ( 2 , 3 , n u l l , n u l l ) ; 
5 
6 wh i l e ( a s y n cRe s u l t . I sCompl e t ed == f a l s e ) 
7 f 
8 a s y n cRe s u l t . AsyncWaitHandle .WaitOne (10 , f a l s e ) ; //mozliwa blok ada 
9 / j a k a s pr a c a / 
10 g 
11 
12 i n t r e s u l t ; 
13 r e s u l t = oppDel . EndInvoke ( a s y n cRe s u l t ) ; // bez bl ok ady 
14 Debug . As s e r t ( r e s u l t == 5) ; 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 52 / 61
Wywołania asynchroniczne Tradycyjny model asynchroniczny 
Czekanie na zakonczenie operacji 
1 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 
2 Bi n a r yOp e r a t i o n oppDel1 = c a l c u l a t o r . Add ; 
3 Bi n a r yOp e r a t i o n oppDel2 = c a l c u l a t o r . Add ; 
4 
5 IAs y n cRe s u l t a s y n cRe s u l t 1 = oppDel1 . Be g inInv o k e ( 2 , 3 , n u l l , n u l l ) ; 
6 IAs y n cRe s u l t a s y n cRe s u l t 2 = oppDel2 . Be g inInv o k e ( 4 , 5 , n u l l , n u l l ) ; 
7 
8 WaitHandle [ ] h a n d l eAr r a y = f a s y n cRe s u l t 1 . AsyncWaitHandle , 
9 a s y n cRe s u l t 2 . AsyncWaitHandle g ; 
10 
11 WaitHandle . Wa i tAl l ( h a n d l eAr r a y ) ; 
12 // i n t i d x = WaitHandle .WaitAny ( h a n d l eAr r a y ) ; 
13 
14 i n t r e s u l t ; 
15 
16 r e s u l t = oppDel1 . EndInvoke ( a s y n cRe s u l t 1 ) ; // bez bl o k ady 
17 Debug . As s e r t ( r e s u l t == 5) ; 
18 
19 r e s u l t = oppDel2 . EndInvoke ( a s y n cRe s u l t 2 ) ; // bez bl o k ady 
20 Debug . As s e r t ( r e s u l t == 9) ; 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 53 / 61
Wywołania asynchroniczne Tradycyjny model asynchroniczny 
Idea wywołan zwrotnych 
Uruchomienie operacji „w tle” 
Wywołanie zadanej metody po ukonczeniu operacji „w tle” 
Sygnatura: void Nazwa(IAsyncResult asyncResut) 
Przekazanie metody zwrotnej w BeginInvoke() 
Standardowy delegat: 
public delegate void AsyncCallback(IAsyncResult 
asyncResult); 
Preferowany mechanizm programowania asynchronicznego w modelu 
tradycyjnym 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 54 / 61
Wywołania asynchroniczne Tradycyjny model asynchroniczny 
Uzycie wywołania zwrotnego 
1 p u b l i c c l a s s C a l c u l a t o r C l i e n t 
2 f 
3 p u b l i c void AsyncAdd ( ) 
4 f 
5 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 
6 Bi n a r yOp e r a t i o n oppDel = c a l c u l a t o r . Add ; 
7 oppDel . Be g inInv o k e ( 2 , 3 , OnMethodCompletion , n u l l ) ; 
8 g 
9 void OnMethodCompletion ( IAs y n cRe s u l t a s y n cRe s u l t ) 
10 f 
11 i n t r e s u l t = 0 ; 
12 
13 As yncRe sul t r e s u l tOb j = ( As yncRe sul t ) a s y n cRe s u l t ; 
14 
15 Debug . As s e r t ( r e s u l tOb j . En d I n v o k eCa l l e d == f a l s e ) ; 
16 Bi n a r yOp e r a t i o n oppDel = ( Bi n a r yOp e r a t i o n ) 
17 r e s u l tOb j . As yncDe l ega t e ; 
18 
19 r e s u l t = oppDel . EndInvoke ( a s y n cRe s u l t ) ; 
20 Trace . Wr i t eLi n e ( ”Zwrocona wa r t o s c to ” + r e s u l t ) ; 
21 g 
22 g 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 55 / 61
Wywołania asynchroniczne Tradycyjny model asynchroniczny 
Przekazywanie parametru 
1 p u b l i c c l a s s C a l c u l a t o r C l i e n t 
2 f 
3 p u b l i c void AsyncAdd ( ) 
4 f 
5 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 
6 Bi n a r yOp e r a t i o n oppDel = c a l c u l a t o r . Add ; 
7 i n t a s y n cSt a t e = 4 ; 
8 oppDel . Be g inInv o k e ( 2 , 3 , OnMethodCompletion , a s y n cSt a t e ) ; 
9 g 
10 void OnMethodCompletion ( IAs y n cRe s u l t a s y n cRe s u l t ) 
11 f 
12 i n t a s y n cSt a t e ; 
13 a s y n cSt a t e = ( i n t ) a s y n cRe s u l t . As yncSt a t e ; 
14 Debug . As s e r t ( a s y n cSt a t e == 4) ; 
15 
16 / r e s z t a wywolania zwrotnego / 
17 g 
18 g 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 56 / 61
Wywołania asynchroniczne Tradycyjny model asynchroniczny 
Informacje dodatkowe 
Para operacji BeginNazwa(...) i EndNazwa(...) w wielu 
klasach 
Stream 
Web.Services 
Przechwytywanie błedów wokół EndInvoke() 
Asynchroniczna publikacja zdarzen 
listowanie delegatów 
wywołanie BeginInvoke() 
FireAsync() z EventsHelper 
Problemy wielowatkowosci 
synchronizacja 
wyczerpanie puli watków 
przedwczesne uzycie wyników 
zwalnianie zasobów 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 57 / 61
Podsumowanie 
Plan wykładu 
1 Zdarzenia 
Delegaty 
Praca ze zdarzeniami 
2 Wywołania asynchroniczne 
Uproszczony model asynchroniczny 
Dostrajanie 
Tradycyjny model asynchroniczny 
Delegaty 
Programowanie asynchroniczne 
3 Podsumowanie 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 58 / 61
Podsumowanie 
Podsumowanie 
Dwa gotowe mechanizmy do wykorzystania 
zdarzenia 
wywołania asynchroniczne 
Delegaty rulez! 
Modele programowania i konwencje 
A za tydzien. . . 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 59 / 61
Podsumowanie 
Do domu 
Przeczytac 6. i 7. rozdział „Programming .NET Components” 
Przeczytac „Asynchronous Programming with Async and Await” z 
MSDN 
Zapoznac sie z mechanizmem zdarzen i modelami programowania 
asynchronicznego 
Zapoznac sie z wzorcem MVVM i jego praktycznym zastosowaniem w 
WPF 
Opanowac tworzenie kontrolek uzytkownika w WPF 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 60 / 61
Podsumowanie 
Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 61 / 61

Weitere ähnliche Inhalte

Andere mochten auch

Optoelektroniczne modelowanie sieci neuronowej cz. 1
Optoelektroniczne modelowanie sieci neuronowej cz. 1Optoelektroniczne modelowanie sieci neuronowej cz. 1
Optoelektroniczne modelowanie sieci neuronowej cz. 1Mikołaj Olszewski
 
The metadata driven e-laboratory web client
The metadata driven e-laboratory web clientThe metadata driven e-laboratory web client
The metadata driven e-laboratory web clientMikołaj Olszewski
 
Programowanie Komponentowe: #B Komponentowe aspekty springa
Programowanie Komponentowe: #B Komponentowe aspekty springaProgramowanie Komponentowe: #B Komponentowe aspekty springa
Programowanie Komponentowe: #B Komponentowe aspekty springaMikołaj Olszewski
 
Programowanie Komponentowe: #E Podsumowanie
Programowanie Komponentowe: #E PodsumowanieProgramowanie Komponentowe: #E Podsumowanie
Programowanie Komponentowe: #E PodsumowanieMikołaj Olszewski
 
Kwantowe struktury półprzewodnikowe
Kwantowe struktury półprzewodnikoweKwantowe struktury półprzewodnikowe
Kwantowe struktury półprzewodnikoweMikołaj Olszewski
 
Optyczne solitony przestrzenne
Optyczne solitony przestrzenneOptyczne solitony przestrzenne
Optyczne solitony przestrzenneMikołaj Olszewski
 
Programowanie Komponentowe: #1 Wprowadzenie
Programowanie Komponentowe: #1 WprowadzenieProgramowanie Komponentowe: #1 Wprowadzenie
Programowanie Komponentowe: #1 WprowadzenieMikołaj Olszewski
 

Andere mochten auch (12)

Optoelektroniczne modelowanie sieci neuronowej cz. 1
Optoelektroniczne modelowanie sieci neuronowej cz. 1Optoelektroniczne modelowanie sieci neuronowej cz. 1
Optoelektroniczne modelowanie sieci neuronowej cz. 1
 
The metadata driven e-laboratory web client
The metadata driven e-laboratory web clientThe metadata driven e-laboratory web client
The metadata driven e-laboratory web client
 
Programowanie Komponentowe: #B Komponentowe aspekty springa
Programowanie Komponentowe: #B Komponentowe aspekty springaProgramowanie Komponentowe: #B Komponentowe aspekty springa
Programowanie Komponentowe: #B Komponentowe aspekty springa
 
Parallel quicksort cz. 2
Parallel quicksort cz. 2Parallel quicksort cz. 2
Parallel quicksort cz. 2
 
Programowanie Komponentowe: #E Podsumowanie
Programowanie Komponentowe: #E PodsumowanieProgramowanie Komponentowe: #E Podsumowanie
Programowanie Komponentowe: #E Podsumowanie
 
Materiały fotorefrakcyjne
Materiały fotorefrakcyjneMateriały fotorefrakcyjne
Materiały fotorefrakcyjne
 
Kwantowe struktury półprzewodnikowe
Kwantowe struktury półprzewodnikoweKwantowe struktury półprzewodnikowe
Kwantowe struktury półprzewodnikowe
 
Optyczne solitony przestrzenne
Optyczne solitony przestrzenneOptyczne solitony przestrzenne
Optyczne solitony przestrzenne
 
Programowanie Komponentowe: #1 Wprowadzenie
Programowanie Komponentowe: #1 WprowadzenieProgramowanie Komponentowe: #1 Wprowadzenie
Programowanie Komponentowe: #1 Wprowadzenie
 
Architektura heksagonalna
Architektura heksagonalnaArchitektura heksagonalna
Architektura heksagonalna
 
Lokalne sieci światłowodowe
Lokalne sieci światłowodoweLokalne sieci światłowodowe
Lokalne sieci światłowodowe
 
Optyka ciekłych kryształów
Optyka ciekłych kryształówOptyka ciekłych kryształów
Optyka ciekłych kryształów
 

Mehr von Mikołaj Olszewski

Optoelektroniczne sieci neuronowe
Optoelektroniczne sieci neuronoweOptoelektroniczne sieci neuronowe
Optoelektroniczne sieci neuronoweMikołaj Olszewski
 
Metody efektywnego łączenia sieci neuronowych
Metody efektywnego łączenia sieci neuronowychMetody efektywnego łączenia sieci neuronowych
Metody efektywnego łączenia sieci neuronowychMikołaj Olszewski
 
Test wyszukiwarek internetowych
Test wyszukiwarek internetowychTest wyszukiwarek internetowych
Test wyszukiwarek internetowychMikołaj Olszewski
 
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NETProgramowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NETMikołaj Olszewski
 
Programowanie komponentowe: #4 Podstawy połączeń komponentów
Programowanie komponentowe: #4 Podstawy połączeń komponentówProgramowanie komponentowe: #4 Podstawy połączeń komponentów
Programowanie komponentowe: #4 Podstawy połączeń komponentówMikołaj Olszewski
 
Programowanie Komponentowe: #2 Metody opisu komponentów
Programowanie Komponentowe: #2 Metody opisu komponentówProgramowanie Komponentowe: #2 Metody opisu komponentów
Programowanie Komponentowe: #2 Metody opisu komponentówMikołaj Olszewski
 

Mehr von Mikołaj Olszewski (13)

Optoelektroniczne sieci neuronowe
Optoelektroniczne sieci neuronoweOptoelektroniczne sieci neuronowe
Optoelektroniczne sieci neuronowe
 
Swiatłowodowy czujnik prądu
Swiatłowodowy czujnik prąduSwiatłowodowy czujnik prądu
Swiatłowodowy czujnik prądu
 
Metody efektywnego łączenia sieci neuronowych
Metody efektywnego łączenia sieci neuronowychMetody efektywnego łączenia sieci neuronowych
Metody efektywnego łączenia sieci neuronowych
 
Parallel quicksort cz. 1
Parallel quicksort cz. 1Parallel quicksort cz. 1
Parallel quicksort cz. 1
 
Maszyna Turinga
Maszyna TuringaMaszyna Turinga
Maszyna Turinga
 
Planowanie działań cz. 2
Planowanie działań cz. 2Planowanie działań cz. 2
Planowanie działań cz. 2
 
Planowanie działań cz. 1
Planowanie działań cz. 1Planowanie działań cz. 1
Planowanie działań cz. 1
 
Model hierarchiczny
Model hierarchicznyModel hierarchiczny
Model hierarchiczny
 
Komputer genetyczny
Komputer genetycznyKomputer genetyczny
Komputer genetyczny
 
Test wyszukiwarek internetowych
Test wyszukiwarek internetowychTest wyszukiwarek internetowych
Test wyszukiwarek internetowych
 
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NETProgramowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
 
Programowanie komponentowe: #4 Podstawy połączeń komponentów
Programowanie komponentowe: #4 Podstawy połączeń komponentówProgramowanie komponentowe: #4 Podstawy połączeń komponentów
Programowanie komponentowe: #4 Podstawy połączeń komponentów
 
Programowanie Komponentowe: #2 Metody opisu komponentów
Programowanie Komponentowe: #2 Metody opisu komponentówProgramowanie Komponentowe: #2 Metody opisu komponentów
Programowanie Komponentowe: #2 Metody opisu komponentów
 

Programowanie Komponentowe: #7 Programowanie asynchroniczne i sterowane zdarzeniami

  • 1. Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 1 / 61
  • 2. Programowanie Komponentowe Wykład #7: Programowanie sterowane zdarzeniami Mikołaj Olszewski Wydział Zastosowan Informatyki i Matematyki Szkoły Głównej Gospodarstwa Wiejskiego 25.11.2014 Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 2 / 61
  • 3. Plan wykładu 1 Zdarzenia Delegaty Praca ze zdarzeniami 2 Wywołania asynchroniczne Uproszczony model asynchroniczny Dostrajanie Tradycyjny model asynchroniczny Delegaty Programowanie asynchroniczne 3 Podsumowanie Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 3 / 61
  • 4. Wprowadzenie Zaawansowane programowanie komponentowe Pełniejsze wykorzystanie zasobów Wieksza skalowalnosc systemu Lepsza responsywnosc Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 4 / 61
  • 5. Zdarzenia Plan wykładu 1 Zdarzenia Delegaty Praca ze zdarzeniami 2 Wywołania asynchroniczne Uproszczony model asynchroniczny Dostrajanie Tradycyjny model asynchroniczny Delegaty Programowanie asynchroniczne 3 Podsumowanie Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 5 / 61
  • 6. Zdarzenia Po co nam zdarzenia? Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 6 / 61
  • 7. Zdarzenia Po co nam zdarzenia? Klient na obiekcie wywoływanie metod zmiana parametrów Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 7 / 61
  • 8. Zdarzenia Po co nam zdarzenia? Klient na obiekcie wywoływanie metod zmiana parametrów Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 7 / 61
  • 9. Zdarzenia Zdarzenia w .NET Natywne wsparcie dla zdarzen event dedykowane implementacje mechanizmy subskrypcji i publikacji Delegaty to podstawa referencja na metode / obiekt funkcyjny delegacja wywołania metody 1 p u b l i c delegate void NumberChangedEventHandler ( i n t number ) ; Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 8 / 61
  • 10. Zdarzenia Delegaty Zródła i subskrybenci Zródło 1 p u b l i c c l a s s MyPubl i she r 2 f 3 p u b l i c NumberChangedEventHandler NumberChanged ; 4 / Po z o s t a l e metody i wl a s c iwo s c i / 5 g Subskrybent 1 p u b l i c c l a s s MySubs c r ibe r 2 f 3 p u b l i c void OnNumberChanged ( i n t number ) 4 f 5 s t r i n g message = ”Nowa wa r t o s c to ” + number ; 6 MessageBox . Show(message , ”MySubs c r ibe r ” ) ; 7 g 8 g Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 9 / 61
  • 11. Zdarzenia Delegaty Zródła i subskrybenci Zródło 1 p u b l i c c l a s s MyPubl i she r 2 f 3 p u b l i c NumberChangedEventHandler NumberChanged ; 4 / Po z o s t a l e metody i wl a s c iwo s c i / 5 g Subskrybent 1 p u b l i c c l a s s MySubs c r ibe r 2 f 3 p u b l i c void OnNumberChanged ( i n t number ) 4 f 5 s t r i n g message = ”Nowa wa r t o s c to ” + number ; 6 MessageBox . Show(message , ”MySubs c r ibe r ” ) ; 7 g 8 g Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 9 / 61
  • 12. Zdarzenia Delegaty Delegate 1 p u b l i c a b s t r a c t c l a s s De l e g a t e : // l i s t a i n t e r f e j s o w 2 f 3 p u b l i c s t a t i c De l e g a t e Combine ( De l e g a t e a , De l e g a t e b ) ; 4 p u b l i c s t a t i c De l e g a t e Remove ( De l e g a t e sour c e , De l e g a t e v a l u e ) ; 5 p u b l i c o b j e c t DynamicInvoke ( o b j e c t [ ] a r g s ) ; 6 p u b l i c v i r t u a l De l e g a t e [ ] Ge t I n v o c a t i o n L i s t ( ) ; 7 // Po z o s t a l e skladowe 8 g Lista delegowanych metod Operatory: =, +=, -= Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 10 / 61
  • 13. Zdarzenia Delegaty Subskrypcja i publikacja 1 MyPubl i she r p u b l i s h e r = new MyPubl i she r ( ) ; 2 MySubs c r ibe r s u b s c r i b e r 1 = new MySubs c r ibe r ( ) ; 3 MySubs c r ibe r s u b s c r i b e r 2 = new MySubs c r ibe r ( ) ; 4 5 p u b l i s h e r . NumberChanged += new NumberChangedEventHandler 6 ( s u b s c r i b e r 1 . OnNumberChanged ) ; 7 // i n f e r e n c j a d e l e g a t u 8 p u b l i s h e r . NumberChanged += s u b s c r i b e r 2 . OnNumberChanged ; 9 10 p u b l i s h e r . NumberChanged ( 3 ) ; 11 12 p u b l i s h e r . NumberChanged −= s u b s c r i b e r 2 . OnNumberChanged ; Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 11 / 61
  • 14. Zdarzenia Delegaty Generyczne delegaty I 1 p u b l i c c l a s s MyClassT 2 f 3 p u b l i c d e l e g a t e void Ge n e r i cEv e n tHa n d l e r (T t ) ; 4 p u b l i c void SomeMethod (T t ) 5 f . . . g 6 g 1 MyClassint . Ge n e r i cEv e n tHa n d l e r d e l ; 2 MyClassint ob j = new MyClassint ( ) ; 3 d e l = o bj . SomeMethod ; 4 // d e l = new MyClassi n t . Ge n e r i cEv e n tHa n d l e r ( ob j . SomeMethod ) ; 5 d e l ( 3 ) ; Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 12 / 61
  • 15. Zdarzenia Delegaty Generyczne delegaty I 1 p u b l i c c l a s s MyClassT 2 f 3 p u b l i c d e l e g a t e void Ge n e r i cEv e n tHa n d l e r (T t ) ; 4 p u b l i c void SomeMethod (T t ) 5 f . . . g 6 g 1 MyClassint . Ge n e r i cEv e n tHa n d l e r d e l ; 2 MyClassint ob j = new MyClassint ( ) ; 3 d e l = o bj . SomeMethod ; 4 // d e l = new MyClassi n t . Ge n e r i cEv e n tHa n d l e r ( ob j . SomeMethod ) ; 5 d e l ( 3 ) ; Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 12 / 61
  • 16. Zdarzenia Delegaty Generyczne delegaty II 1 p u b l i c d e l e g a t e void Gene r i cEv entHandl e rT(T t ) ; 2 3 p u b l i c c l a s s MyClass 4 f 5 p u b l i c void SomeMethod ( i n t number ) 6 f . . . g 7 g 8 9 Gene r i cEv entHandl e rint d e l ; 10 11 MyClass ob j = new MyClass ( ) ; 12 d e l = o bj . SomeMethod ; 13 d e l ( 3 ) ; Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 13 / 61
  • 17. Zdarzenia Delegaty event Delegaty wystarczajace Problem z delegatem Zalety event 1 p u b l i c d e l e g a t e void NumberChangedEventHandler ( i n t number ) ; 2 3 p u b l i c c l a s s MyPubl i she r 4 f 5 p u b l i c event NumberChangedEventHandler NumberChanged ; 6 p u b l i c void Fi r eEv e n t ( i n t number ) 7 f 8 NumberChanged ( number ) ; 9 g 10 g Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 14 / 61
  • 18. Zdarzenia Delegaty event Delegaty wystarczajace Problem z delegatem Zalety event 1 p u b l i c d e l e g a t e void NumberChangedEventHandler ( i n t number ) ; 2 3 p u b l i c c l a s s MyPubl i she r 4 f 5 p u b l i c event NumberChangedEventHandler NumberChanged ; 6 p u b l i c void Fi r eEv e n t ( i n t number ) 7 f 8 NumberChanged ( number ) ; 9 g 10 g Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 14 / 61
  • 19. Zdarzenia Delegaty Problemy Powtarzanie kodu dla kazdego zródła zdarzen Brak mozliwosci filtrowania zdarzen Zaleznosc od instancji zródła Wspólny czas zycia Łaczenie programowe Rozwiazania Loosely Coupled Events Message Queue Enterprise Service Bus Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 15 / 61
  • 20. Zdarzenia Delegaty Problemy Powtarzanie kodu dla kazdego zródła zdarzen Brak mozliwosci filtrowania zdarzen Zaleznosc od instancji zródła Wspólny czas zycia Łaczenie programowe Rozwiazania Loosely Coupled Events Message Queue Enterprise Service Bus Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 15 / 61
  • 21. Zdarzenia Praca ze zdarzeniami Sygnatura delegata Informacja jednokierunkowa 1 p u b l i c d e l e g a t e void NumberChangedEventHandler ( i n t number ) ; Obsługa wielu zródeł 1 p u b l i c d e l e g a t e void NumberChangedEventHandler 2 ( o b j e c t s ende r , i n t number ) ; Uniezaleznienie zródła od subskrybenta 1 p u b l i c d e l e g a t e void NumberChangedEventHandler 2 ( o b j e c t s ende r , EventArgs e v entAr g s ) ; 3 EventArgs . Empty Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 16 / 61
  • 22. Zdarzenia Praca ze zdarzeniami Sygnatura delegata Informacja jednokierunkowa 1 p u b l i c d e l e g a t e void NumberChangedEventHandler ( i n t number ) ; Obsługa wielu zródeł 1 p u b l i c d e l e g a t e void NumberChangedEventHandler 2 ( o b j e c t s ende r , i n t number ) ; Uniezaleznienie zródła od subskrybenta 1 p u b l i c d e l e g a t e void NumberChangedEventHandler 2 ( o b j e c t s ende r , EventArgs e v entAr g s ) ; 3 EventArgs . Empty Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 16 / 61
  • 23. Zdarzenia Praca ze zdarzeniami Sygnatura delegata Informacja jednokierunkowa 1 p u b l i c d e l e g a t e void NumberChangedEventHandler ( i n t number ) ; Obsługa wielu zródeł 1 p u b l i c d e l e g a t e void NumberChangedEventHandler 2 ( o b j e c t s ende r , i n t number ) ; Uniezaleznienie zródła od subskrybenta 1 p u b l i c d e l e g a t e void NumberChangedEventHandler 2 ( o b j e c t s ende r , EventArgs e v entAr g s ) ; 3 EventArgs . Empty Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 16 / 61
  • 24. Zdarzenia Praca ze zdarzeniami Uzycie standardowego argumentu I 1 p u b l i c d e l e g a t e void NumberChangedEventHandler 2 ( o b j e c t s ende r , EventArgs e v entAr g s ) ; 3 4 p u b l i c c l a s s NumberChangedEventArgs : EventArgs 5 f 6 f . . . g 7 p u b l i c i n t Number f ge t ; g 8 g 9 p u b l i c c l a s s MyPubl i she r 10 f 11 p u b l i c event NumberChangedEventHandler NumberChanged ; 12 p u b l i c void FireNewNumberEvent ( EventArgs e v entAr g s ) 13 f 14 i f (NumberChanged != n u l l ) 15 NumberChanged ( t h i s , e v entAr g s ) ; 16 g 17 g Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 17 / 61
  • 25. Zdarzenia Praca ze zdarzeniami Uzycie standardowego argumentu II 1 p u b l i c c l a s s MySubs c r ibe r 2 f 3 p u b l i c void OnNumberChanged 4 ( o b j e c t s ende r , EventArgs e v entAr g s ) 5 f 6 NumberChangedEventArgs numberArg ; 7 numberArg = e v entAr g s as NumberChangedEventArgs ; 8 Debug . As s e r t ( numberArg != n u l l ) ; 9 s t r i n g message = numberArg . Number ; 10 MessageBox . Show( ”Nowy numer to ”+ message ) ; 11 g 12 g Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 18 / 61
  • 26. Zdarzenia Praca ze zdarzeniami Standardowa obsługa zdarzen Wersja podstawowa 1 p u b l i c d e l e g a t e void Ev entHandl e r 2 ( o b j e c t s ende r , EventArgs e v entAr g s ) ; Wersja generyczna 1 p u b l i c d e l e g a t e void EventHandlerE( o b j e c t s ende r , E e ) 2 where E : EventArgs ; Wersja w pełni generyczna 1 p u b l i c d e l e g a t e void Gene r i cEv entHandl e rT, E(T s ende r , E e ) 2 where E : Ev ent sArgs ; Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 19 / 61
  • 27. Zdarzenia Praca ze zdarzeniami Standardowa obsługa zdarzen Wersja podstawowa 1 p u b l i c d e l e g a t e void Ev entHandl e r 2 ( o b j e c t s ende r , EventArgs e v entAr g s ) ; Wersja generyczna 1 p u b l i c d e l e g a t e void EventHandlerE( o b j e c t s ende r , E e ) 2 where E : EventArgs ; Wersja w pełni generyczna 1 p u b l i c d e l e g a t e void Gene r i cEv entHandl e rT, E(T s ende r , E e ) 2 where E : Ev ent sArgs ; Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 19 / 61
  • 28. Zdarzenia Praca ze zdarzeniami Standardowa obsługa zdarzen Wersja podstawowa 1 p u b l i c d e l e g a t e void Ev entHandl e r 2 ( o b j e c t s ende r , EventArgs e v entAr g s ) ; Wersja generyczna 1 p u b l i c d e l e g a t e void EventHandlerE( o b j e c t s ende r , E e ) 2 where E : EventArgs ; Wersja w pełni generyczna 1 p u b l i c d e l e g a t e void Gene r i cEv entHandl e rT, E(T s ende r , E e ) 2 where E : Ev ent sArgs ; Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 19 / 61
  • 29. Zdarzenia Praca ze zdarzeniami Przechwytywanie wyjatków I 1 p u b l i c c l a s s MyPubl i she r 2 f 3 p u b l i c event Ev entHandl e r MyEvent ; 4 p u b l i c void Fi r eEv e n t ( ) 5 f 6 t r y 7 f 8 i f (MyEvent != n u l l ) 9 MyEvent ( t h i s , EventArgs . Empty ) ; 10 g 11 catch 12 f 13 //Obsluga wy jatku 14 g 15 g 16 g Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 20 / 61
  • 30. Zdarzenia Praca ze zdarzeniami Przechwytywanie wyjatków II 1 p u b l i c c l a s s MyPubl i she r 2 f 3 p u b l i c event Ev entHandl e r MyEvent ; 4 p u b l i c void Fi r eEv e n t ( ) 5 f 6 i f (MyEvent == n u l l ) 7 f 8 r e t u r n ; 9 g 10 De l e g a t e [ ] d e l e g a t e s = MyEvent . Ge t I n v o c a t i o n L i s t ( ) ; 11 f o r e a ch ( De l e g a t e d e l i n d e l e g a t e s ) 12 f 13 Ev entHandl e r s i n k = ( Ev entHandl e r ) d e l ; 14 t r y 15 f 16 s i n k ( t h i s , EventArgs . Empty ) ; 17 g 18 catch 19 f 20 // o b s l u g a wy jatku 21 g 22 g 23 g 24 g Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 21 / 61
  • 31. Zdarzenia Praca ze zdarzeniami EventsHelper 1 p u b l i c s t a t i c c l a s s Ev e n t sHe l p e r 2 f 3 p u b l i c s t a t i c void F i r e ( De l e g a t e de l , params o b j e c t [ ] a r g s ) 4 f 5 i f ( d e l == n u l l ) 6 f 7 r e t u r n ; 8 g 9 De l e g a t e [ ] d e l e g a t e s = d e l . Ge t I n v o c a t i o n L i s t ( ) ; 10 f o r e a ch ( De l e g a t e s i n k i n d e l e g a t e s ) 11 f 12 t r y 13 f 14 s i n k . DynamicInvoke ( a r g s ) ; 15 g catch fg 16 g 17 g 18 g 1 us ing MyEventHandler = Gene r i cEv entHandl e rMyPublisher , NumberChangedEventArgs ; Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 22 / 61
  • 32. Zdarzenia Praca ze zdarzeniami EventsHelper 1 p u b l i c s t a t i c c l a s s Ev e n t sHe l p e r 2 f 3 p u b l i c s t a t i c void F i r e ( De l e g a t e de l , params o b j e c t [ ] a r g s ) 4 f 5 i f ( d e l == n u l l ) 6 f 7 r e t u r n ; 8 g 9 De l e g a t e [ ] d e l e g a t e s = d e l . Ge t I n v o c a t i o n L i s t ( ) ; 10 f o r e a ch ( De l e g a t e s i n k i n d e l e g a t e s ) 11 f 12 t r y 13 f 14 s i n k . DynamicInvoke ( a r g s ) ; 15 g catch fg 16 g 17 g 18 g 1 us ing MyEventHandler = Gene r i cEv entHandl e rMyPublisher , NumberChangedEventArgs ; Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 22 / 61
  • 33. Zdarzenia Praca ze zdarzeniami Obsługa duzej liczby zdarzen I 1 p u b l i c s e a l e d c l a s s Ev e n tHa n d l e r L i s t : IDi s p o s a b l e 2 f 3 p u b l i c Ev e n tHa n d l e r L i s t ( ) ; 4 p u b l i c De l e g a t e t h i s [ o b j e c t key ] f ge t ; s e t ; g 5 p u b l i c void AddHandler ( o b j e c t key , De l e g a t e v a l u e ) ; 6 p u b l i c void AddHandlers ( Ev e n tHa n d l e r L i s t listToAddFrom ) ; 7 p u b l i c void RemoveHandler ( o b j e c t key , De l e g a t e v a l u e ) ; 8 p u b l i c v i r t u a l void Di spo s e ( ) ; 9 g Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 23 / 61
  • 34. Zdarzenia Praca ze zdarzeniami Obsługa duzej liczby zdarzen II 1 us ing Cl i c kEv e n tHa n d l e r = Gene r i cEv entHandl e rMyButton , EventArgs; 2 us ing MouseEventHandler = Gene r i cEv entHandl e rMyButton , MouseEventArgs; 34 p u b l i c c l a s s MyButton 5 f 6 Ev e n tHa n d l e r L i s t e v e n t L i s t ; 7 p u b l i c MyButton ( ) 8 f 9 e v e n t L i s t = new Ev e n tHa n d l e r L i s t ( ) ; 10 g 11 p u b l i c event Cl i c kEv e n tHa n d l e r Cl i c k 12 f 13 add f e v e n t L i s t . AddHandler ( ” Cl i c k ” , v a l u e ) ; g 14 remove f e v e n t L i s t . RemoveHandler ( ” Cl i c k ” , v a l u e ) ; g 15 g 16 p u b l i c event MouseEventHandler MouseMove 17 f 18 add f e v e n t L i s t . AddHandler ( ”MouseMove” , v a l u e ) ; g 19 remove f e v e n t L i s t . RemoveHandler ( ”MouseMove” , v a l u e ) ; g 20 g 21 void F i r e C l i c k ( ) 22 f 23 Cl i c kEv e n tHa n d l e r h a n d l e r = e v e n t L i s t [ ” Cl i c k ” ] as Cl i c kEv e n tHa n d l e r ; 24 Ev e n t sHe l p e r . F i r e ( handl e r , t h i s , EventArgs . Empty ) ; 25 g 26 void FireMouseMove (MouseButtons button , i n t c l i c k s , i n t x , i n t y , i n t d e l t a ) 27 f 28 MouseEventHandler h a n d l e r = e v e n t L i s t [ ”MouseMove” ] as MouseEventHandler ; 29 MouseEventArgs a r g s = new MouseEventArgs ( button , c l i c k s , x , y , d e l t a ) ; 30 Ev e n t sHe l p e r . F i r e ( handl e r , t h i s , a r g s ) ; 31 g 32 gMikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 24 / 61
  • 35. Wywołania asynchroniczne Plan wykładu 1 Zdarzenia Delegaty Praca ze zdarzeniami 2 Wywołania asynchroniczne Uproszczony model asynchroniczny Dostrajanie Tradycyjny model asynchroniczny Delegaty Programowanie asynchroniczne 3 Podsumowanie Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 25 / 61
  • 36. Wywołania asynchroniczne Po co nam wywołania asynchroniczne? Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 26 / 61
  • 37. Wywołania asynchroniczne Po co nam wywołania asynchroniczne? Blokowanie watku na wywołaniu metody długie działanie niewykorzystanie maszyny blokowanie GUI Remedium — natychmiastowy powrót Oddelegowanie zadania do działania „w tle” Poinformowanie o zakonczeniu działania „w tle” Korzysci poprawienie dostepnosci zwiekszenie przepustowosci polepszenie skalowalnosci Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
  • 38. Wywołania asynchroniczne Po co nam wywołania asynchroniczne? Blokowanie watku na wywołaniu metody długie działanie niewykorzystanie maszyny blokowanie GUI Remedium — natychmiastowy powrót Oddelegowanie zadania do działania „w tle” Poinformowanie o zakonczeniu działania „w tle” Korzysci poprawienie dostepnosci zwiekszenie przepustowosci polepszenie skalowalnosci Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
  • 39. Wywołania asynchroniczne Po co nam wywołania asynchroniczne? Blokowanie watku na wywołaniu metody długie działanie niewykorzystanie maszyny blokowanie GUI Remedium — natychmiastowy powrót Oddelegowanie zadania do działania „w tle” Poinformowanie o zakonczeniu działania „w tle” Korzysci poprawienie dostepnosci zwiekszenie przepustowosci polepszenie skalowalnosci Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
  • 40. Wywołania asynchroniczne Po co nam wywołania asynchroniczne? Blokowanie watku na wywołaniu metody długie działanie niewykorzystanie maszyny blokowanie GUI Remedium — natychmiastowy powrót Oddelegowanie zadania do działania „w tle” Poinformowanie o zakonczeniu działania „w tle” Korzysci poprawienie dostepnosci zwiekszenie przepustowosci polepszenie skalowalnosci Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
  • 41. Wywołania asynchroniczne Po co nam wywołania asynchroniczne? Blokowanie watku na wywołaniu metody długie działanie niewykorzystanie maszyny blokowanie GUI Remedium — natychmiastowy powrót Oddelegowanie zadania do działania „w tle” Poinformowanie o zakonczeniu działania „w tle” Korzysci poprawienie dostepnosci zwiekszenie przepustowosci polepszenie skalowalnosci Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
  • 42. Wywołania asynchroniczne Po co nam wywołania asynchroniczne? Blokowanie watku na wywołaniu metody długie działanie niewykorzystanie maszyny blokowanie GUI Remedium — natychmiastowy powrót Oddelegowanie zadania do działania „w tle” Poinformowanie o zakonczeniu działania „w tle” Korzysci poprawienie dostepnosci zwiekszenie przepustowosci polepszenie skalowalnosci Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
  • 43. Wywołania asynchroniczne Po co nam wywołania asynchroniczne? Blokowanie watku na wywołaniu metody długie działanie niewykorzystanie maszyny blokowanie GUI Remedium — natychmiastowy powrót Oddelegowanie zadania do działania „w tle” Poinformowanie o zakonczeniu działania „w tle” Korzysci poprawienie dostepnosci zwiekszenie przepustowosci polepszenie skalowalnosci Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
  • 44. Wywołania asynchroniczne Po co nam wywołania asynchroniczne? Blokowanie watku na wywołaniu metody długie działanie niewykorzystanie maszyny blokowanie GUI Remedium — natychmiastowy powrót Oddelegowanie zadania do działania „w tle” Poinformowanie o zakonczeniu działania „w tle” Korzysci poprawienie dostepnosci zwiekszenie przepustowosci polepszenie skalowalnosci Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
  • 45. Wywołania asynchroniczne Po co nam wywołania asynchroniczne? Blokowanie watku na wywołaniu metody długie działanie niewykorzystanie maszyny blokowanie GUI Remedium — natychmiastowy powrót Oddelegowanie zadania do działania „w tle” Poinformowanie o zakonczeniu działania „w tle” Korzysci poprawienie dostepnosci zwiekszenie przepustowosci polepszenie skalowalnosci Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
  • 46. Wywołania asynchroniczne Po co nam wywołania asynchroniczne? Blokowanie watku na wywołaniu metody długie działanie niewykorzystanie maszyny blokowanie GUI Remedium — natychmiastowy powrót Oddelegowanie zadania do działania „w tle” Poinformowanie o zakonczeniu działania „w tle” Korzysci poprawienie dostepnosci zwiekszenie przepustowosci polepszenie skalowalnosci Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
  • 47. Wywołania asynchroniczne Po co nam wywołania asynchroniczne? Blokowanie watku na wywołaniu metody długie działanie niewykorzystanie maszyny blokowanie GUI Remedium — natychmiastowy powrót Oddelegowanie zadania do działania „w tle” Poinformowanie o zakonczeniu działania „w tle” Korzysci poprawienie dostepnosci zwiekszenie przepustowosci polepszenie skalowalnosci Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 27 / 61
  • 48. Wywołania asynchroniczne Wymagania dla mechanizmu wywołan asynchronicznych Mozliwosc wymiennego uzywania wywołan synchronicznych i asynchronicznych na komponencie Klient decyduje jakiego rodzaju wywołan chce uzywac Mozliwosc wywołania wielu asynchronicznych metod działajacych w tym samym czasie Mozliwosc dostepu do wyników wykonania metody asynchronicznej Wszystkie wyjatki w komponencie powinny zostac przekazane do klienta Prostota i wydajnosc uzywania Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 28 / 61
  • 49. Wywołania asynchroniczne Działania asynchroniczne w .NET Wiele watków Nowe wywołanie — nowy watek .NET thread pool — całkowicie przezroczyste dla programisty Współprogramy (z ang. coroutines) Rózne modele programowania Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 29 / 61
  • 50. Wywołania asynchroniczne Działania asynchroniczne w .NET Wiele watków Nowe wywołanie — nowy watek .NET thread pool — całkowicie przezroczyste dla programisty Współprogramy (z ang. coroutines) Rózne modele programowania Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 29 / 61
  • 51. Wywołania asynchroniczne Działania asynchroniczne w .NET Wiele watków Nowe wywołanie — nowy watek nowe zadanie dla watku z puli .NET thread pool — całkowicie przezroczyste dla programisty Współprogramy (z ang. coroutines) Rózne modele programowania Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 29 / 61
  • 52. Wywołania asynchroniczne Działania asynchroniczne w .NET Wiele watków Nowe wywołanie — nowy watek nowe zadanie dla watku z puli .NET thread pool — całkowicie przezroczyste dla programisty Współprogramy (z ang. coroutines) Rózne modele programowania Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 29 / 61
  • 53. Wywołania asynchroniczne Działania asynchroniczne w .NET Wiele watków Nowe wywołanie — nowy watek nowe zadanie dla watku z puli .NET thread pool — całkowicie przezroczyste dla programisty Współprogramy (z ang. coroutines) Rózne modele programowania Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 29 / 61
  • 54. Wywołania asynchroniczne Działania asynchroniczne w .NET Wiele watków Nowe wywołanie — nowy watek nowe zadanie dla watku z puli .NET thread pool — całkowicie przezroczyste dla programisty Współprogramy (z ang. coroutines) Rózne modele programowania Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 29 / 61
  • 55. Wywołania asynchroniczne Uproszczony model asynchroniczny Model uproszczony Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 30 / 61
  • 56. Wywołania asynchroniczne Uproszczony model asynchroniczny Model uproszczony Programowanie asynchroniczne jest wazne – UX Problem dla programistów Myslenie synchroniczne Automatyczna generacja kodu asynchronicznego z drobna pomoca programisty async i await Współprogramy Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 31 / 61
  • 57. Wywołania asynchroniczne Uproszczony model asynchroniczny Metoda (a-)/synchroniczna 1 i n t AccessTheWeb ( ) 2 f 3 Ht t pCl i e n t c l i e n t = 4 new Ht t pCl i e n t ( ) ; 5 6 s t r i n g u r lCo n t e n t s = 7 c l i e n t . Ge t S t r i n g ( ” ht tp : / / wzim . sggw . p l ” ) ; 8 9 DoIndependentWork ( ) ; 10 11 12 13 14 r e t u r n u r lCo n t e n t s . Length ; 15 g 1 async Taskint AccessTheWebAsync ( ) 2 f 3 Ht t pCl i e n t c l i e n t = 4 new Ht t pCl i e n t ( ) ; 5 6 Tasks t r i n g g e t S t r i n gTa s k = 7 c l i e n t . Ge tSt r i ngAs y n c ( ” ht tp : / / wzim . sggw . p l ” ) ; 8 9 DoIndependentWork ( ) ; 10 11 s t r i n g u r lCo n t e n t s = 12 awai t g e t S t r i n gTa s k ; 13 14 r e t u r n u r lCo n t e n t s . Length ; 15 g Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 32 / 61
  • 58. Wywołania asynchroniczne Uproszczony model asynchroniczny Metoda (a-)/synchroniczna 1 i n t AccessTheWeb ( ) 2 f 3 Ht t pCl i e n t c l i e n t = 4 new Ht t pCl i e n t ( ) ; 5 6 s t r i n g u r lCo n t e n t s = 7 c l i e n t . Ge t S t r i n g ( ” ht tp : / / wzim . sggw . p l ” ) ; 8 9 DoIndependentWork ( ) ; 10 11 12 13 14 r e t u r n u r lCo n t e n t s . Length ; 15 g 1 async Taskint AccessTheWebAsync ( ) 2 f 3 Ht t pCl i e n t c l i e n t = 4 new Ht t pCl i e n t ( ) ; 5 6 Tasks t r i n g g e t S t r i n gTa s k = 7 c l i e n t . Ge tSt r i ngAs y n c ( ” ht tp : / / wzim . sggw . p l ” ) ; 8 9 DoIndependentWork ( ) ; 10 11 s t r i n g u r lCo n t e n t s = 12 awai t g e t S t r i n gTa s k ; 13 14 r e t u r n u r lCo n t e n t s . Length ; 15 g Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 32 / 61
  • 59. Wywołania asynchroniczne Uproszczony model asynchroniczny Przepływ sterowania Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 33 / 61
  • 60. Wywołania asynchroniczne Uproszczony model asynchroniczny Zwracane typy TaskTResult Task void uzywane w procedurach obsługi zdarzen brak mozliwosci przechwytywania wyjatków jak w IDL-u . . . Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 34 / 61
  • 61. Wywołania asynchroniczne Uproszczony model asynchroniczny Zwracane typy TaskTResult Task void uzywane w procedurach obsługi zdarzen brak mozliwosci przechwytywania wyjatków jak w IDL-u . . . Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 34 / 61
  • 62. Wywołania asynchroniczne Uproszczony model asynchroniczny Zwracane typy TaskTResult Task void uzywane w procedurach obsługi zdarzen brak mozliwosci przechwytywania wyjatków jak w IDL-u . . . Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 34 / 61
  • 63. Wywołania asynchroniczne Uproszczony model asynchroniczny Zwracane typy TaskTResult Task void uzywane w procedurach obsługi zdarzen brak mozliwosci przechwytywania wyjatków jak w IDL-u . . . Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 34 / 61
  • 64. Wywołania asynchroniczne Uproszczony model asynchroniczny Zwracane typy TaskTResult Task void uzywane w procedurach obsługi zdarzen brak mozliwosci przechwytywania wyjatków jak w IDL-u . . . Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 34 / 61
  • 65. Wywołania asynchroniczne Uproszczony model asynchroniczny Zwracane typy TaskTResult Task void uzywane w procedurach obsługi zdarzen brak mozliwosci przechwytywania wyjatków jak w IDL-u . . . Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 34 / 61
  • 66. Wywołania asynchroniczne Uproszczony model asynchroniczny Watki Współprogramy jeden watek ten sam kontekst synchronizacji brak „aktywnego czekania” — zwalnianie zasobów Przeniesienie działania do oddzielnego watku („w tle”) Task.Run działanie w puli watków Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 35 / 61
  • 67. Wywołania asynchroniczne Uproszczony model asynchroniczny Watki Współprogramy jeden watek ten sam kontekst synchronizacji brak „aktywnego czekania” — zwalnianie zasobów Przeniesienie działania do oddzielnego watku („w tle”) Task.Run działanie w puli watków Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 35 / 61
  • 68. Wywołania asynchroniczne Uproszczony model asynchroniczny Anulowanie zadania I 1 Ca n c e l l a t i o nTo k e nSo u r c e c t s ; 2 3 . . . 4 5 p r i v a t e async void s t a r tBu t t o n C l i c k ( o b j e c t s , RoutedEventArgs e ) 6 f 7 c t s = new Ca n c e l l a t i o nTo k e nSo u r c e ( ) ; 8 t r y 9 f 10 i n t c ont entLeng th = awai t AccessTheWebAsync ( c t s . Token ) ; 11 g 12 catch ( Op e r a t i o nCa n c e l e dEx c e p t i o n ) 13 f 14 . . . 15 g 16 catch ( Ex c e p t i o n ) 17 f 18 . . . 19 g 20 c t s = n u l l ; Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 36 / 61
  • 69. Wywołania asynchroniczne Uproszczony model asynchroniczny Anulowanie zadania II 21 g 22 23 p r i v a t e void c a n c e lBu t t o n Cl i c k ( o b j e c t s ende r , RoutedEventArgs e ) 24 f 25 i f ( c t s != n u l l ) 26 c t s . Canc e l ( ) ; 27 // c t s . Ca n c e lAf t e r (2500) ; 28 g 29 30 async Taskint AccessTheWebAsync ( Ca n c e l l a t i o nTo k e n c t ) 31 f 32 . . . 33 HttpResponseMessage r e s p o n s e = 34 awai t c l i e n t . GetAsync ( ” ht tp : / / wzim . sggw . p l ” , c t ) ; 35 . . . 36 g CancellationToken IsCancellationRequested ThrowIfCancellationRequested() Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 37 / 61
  • 70. Wywołania asynchroniczne Uproszczony model asynchroniczny Lista zadan asynchronicznych I 1 async Taskint ProcessURLAsync ( s t r i n g u r l , Ht t pCl i e n t c l i e n t , Ca n c e l l a t i o nTo k e n c t ) 2 f 3 HttpResponseMessage r e s p o n s e = awai t c l i e n t . GetAsync ( u r l , c t ) ; 4 byte [ ] u r lCo n t e n t s = awai t r e s p o n s e . Content . ReadAsByteArrayAsync ( ) ; 5 r e t u r n u r lCo n t e n t s . Length ; 6 g 7 8 async Task AccessTheWebAsync ( Ca n c e l l a t i o nTo k e n c t ) 9 f 10 Ht t pCl i e n t c l i e n t = new Ht t pCl i e n t ( ) ; 11 L i s t s t r i n g u r l L i s t = new L i s t s t r i n g 12 f 13 ” ht tp : / / wzim . sggw . p l ” , 14 ” ht tp : / / demotywatory . p l ” , 15 . . . 16 g 17 18 Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 38 / 61
  • 71. Wywołania asynchroniczne Uproszczony model asynchroniczny Lista zadan asynchronicznych II 19 IEnumerableTaskint downloadTasksQuery = 20 from u r l i n u r l L i s t s e l e c t ProcessURLAsync ( u r l , c l i e n t , c t ) ; 21 22 Taskint [] downloadTasks = downloadTasksQuery . ToArray ( ) ; 23 // L i s t Taski n t downloadTasks = downloadTasksQuery . ToLi s t ( ) ; 24 25 Taskint f i r s t F i n i s h e d T a s k = awai t Task .WhenAny ( downloadTasks ) ; 26 c t s . Canc e l ( ) ; 27 // downloadTasks . Remove ( f i r s t F i n i s h e d T a s k ) ; 28 var l e n g t h = awai t f i r s t F i n i s h e d T a s k ; 29 30 // i n t [ ] l e n g t h s = awa i t Task . WhenAll ( downloadTasks ) ; 31 32 . . . 33 g Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 39 / 61
  • 72. Wywołania asynchroniczne Uproszczony model asynchroniczny Podsumowanie modelu uproszczonego Myslenie synchroniczne + słowa kluczowe Współprogramy z ew. delegacja zadan do watków „w tle” Operowanie na pojedynczym zadaniu lub kolekcji zadan Asynchroniczne procedury obsługi zdarzen Uwazac na wielokrotne uruchamianie tych samych zadan asynchronicznych Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 40 / 61
  • 73. Wywołania asynchroniczne Tradycyjny model asynchroniczny Model tradycyjny Oparty na delegatach Wywołania zwrotne Zadania realizowane w puli watków Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 41 / 61
  • 74. Wywołania asynchroniczne Tradycyjny model asynchroniczny Delegaty raz jeszcze I 1 p u b l i c c l a s s C a l c u l a t o r 2 f 3 p u b l i c i n t Add ( i n t argument1 , i n t argument2 ) 4 f 5 r e t u r n argument1 + argument2 ; 6 g 7 p u b l i c i n t Sub ( i n t argument1 , i n t argument2 ) 8 f 9 r e t u r n argument1 − argument2 ; 10 g 11 g Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 42 / 61
  • 75. Wywołania asynchroniczne Tradycyjny model asynchroniczny Delegaty raz jeszcze II 1 p u b l i c d e l e g a t e i n t Bi n a r yOp e r a t i o n ( i n t argument1 , i n t argument2 ) ; 2 3 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 4 Bi n a r yOp e r a t i o n oppDel = c a l c u l a t o r . Add ; 5 i n t r e s u l t = 0 ; 6 r e s u l t = oppDel ( 2 , 3 ) ; 7 Debug . As s e r t ( r e s u l t == 5) ; Blokowanie do czasu wykonania Add(...) Istnieje mozliwosc wywołania asynchronicznego Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 43 / 61
  • 76. Wywołania asynchroniczne Tradycyjny model asynchroniczny Asynchronicznosc w delegatach 1 p u b l i c s e a l e d c l a s s Bi n a r yOp e r a t i o n : Mu l t i c a s tDe l e g a t e 2 f 3 p u b l i c Bi n a r yOp e r a t i o n ( Obj e c t t a r g e t , i n t methodPtr ) 4 f . . . g 5 p u b l i c v i r t u a l i n t I n v o k e ( i n t argument1 , i n t argument2 ) 6 f . . . g 7 p u b l i c v i r t u a l IAs y n cRe s u l t Be g inInv o k e ( i n t argument1 , 8 i n t argument2 , 9 As yncCa l lba c k c a l l b a c k , 10 o b j e c t a s y n cSt a t e ) 11 f . . . g 12 p u b l i c v i r t u a l i n t EndInvoke ( IAs y n cRe s u l t r e s u l t ) 13 f . . . g 14 g Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 44 / 61
  • 77. Wywołania asynchroniczne Tradycyjny model asynchroniczny BeginInvoke i EndInvoke IAsyncResult BeginInvoke(..., AsyncCallback callback, object asyncState) takie same parametry callback (mozliwy null) asyncState (mozliwy null) zwraca uchwyt do operacji asynchronicznej ... EndInvoke(..., IAsyncResult asyncResult) takie same parametry wyjsciowe + asyncResult zwraca to samo 1 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 2 Bi n a r yOp e r a t i o n oppDel = c a l c u l a t o r . Add ; 3 oppDel . Be g inInv o k e ( 2 , 3 , n u l l , n u l l ) Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 45 / 61
  • 78. Wywołania asynchroniczne Tradycyjny model asynchroniczny BeginInvoke i EndInvoke IAsyncResult BeginInvoke(..., AsyncCallback callback, object asyncState) takie same parametry callback (mozliwy null) asyncState (mozliwy null) zwraca uchwyt do operacji asynchronicznej ... EndInvoke(..., IAsyncResult asyncResult) takie same parametry wyjsciowe + asyncResult zwraca to samo 1 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 2 Bi n a r yOp e r a t i o n oppDel = c a l c u l a t o r . Add ; 3 oppDel . Be g inInv o k e ( 2 , 3 , n u l l , n u l l ) Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 45 / 61
  • 79. Wywołania asynchroniczne Tradycyjny model asynchroniczny BeginInvoke i EndInvoke IAsyncResult BeginInvoke(..., AsyncCallback callback, object asyncState) takie same parametry callback (mozliwy null) asyncState (mozliwy null) zwraca uchwyt do operacji asynchronicznej ... EndInvoke(..., IAsyncResult asyncResult) takie same parametry wyjsciowe + asyncResult zwraca to samo 1 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 2 Bi n a r yOp e r a t i o n oppDel = c a l c u l a t o r . Add ; 3 oppDel . Be g inInv o k e ( 2 , 3 , n u l l , n u l l ) Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 45 / 61
  • 80. Wywołania asynchroniczne Tradycyjny model asynchroniczny IAsyncResult 1 p u b l i c i n t e r f a c e IAs y n cRe s u l t 2 f 3 o b j e c t As yncSt a t e f ge t ; g 4 WaitHandle AsyncWaitHandle f ge t ; g 5 bool Compl e t edSynchronous l y f ge t ; g 6 bool I sCompl e t ed f ge t ; g 7 g Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 46 / 61
  • 81. Wywołania asynchroniczne Tradycyjny model asynchroniczny Uzycie asynchronicznosci 1 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 2 Bi n a r yOp e r a t i o n oppDel = c a l c u l a t o r . Add ; 3 4 IAs y n cRe s u l t a s y n cRe s u l t 1 = oppDel . Be g inInv o k e ( 2 , 3 , n u l l , n u l l ) ; 5 IAs y n cRe s u l t a s y n cRe s u l t 2 = oppDel . Be g inInv o k e ( 4 , 5 , n u l l , n u l l ) ; 6 7 / j a k a s pr a c a / 8 9 i n t r e s u l t ; 10 11 // blok ada do c z a su z a k o n c z e n i a o p e r a c j i 12 r e s u l t = oppDel . EndInvoke ( a s y n cRe s u l t 1 ) ; 13 Debug . As s e r t ( r e s u l t == 5) ; 14 15 // blok ada do c z a su z a k o n c z e n i a o p e r a c j i 16 r e s u l t = oppDel . EndInvoke ( a s y n cRe s u l t 2 ) ; 17 Debug . As s e r t ( r e s u l t == 9) ; Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 47 / 61
  • 82. Wywołania asynchroniczne Tradycyjny model asynchroniczny Podstawowe reguły EndInvoke() tylko raz dla operacji inaczej InvalidOperationException Tylko jeden element na liscie delegatów inaczej ArgumentException IAsyncResult do odpowiedniego EndInvoke() inaczej InvalidOperationException Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 48 / 61
  • 83. Wywołania asynchroniczne Tradycyjny model asynchroniczny AsyncResult 1 p u b l i c c l a s s As yncRe sul t : IAs y n cRe s u l t , IMe s s ageSink 2 f 3 // impl ement a c j a IAs y n cRe s u l t 4 p u b l i c v i r t u a l o b j e c t As yncSt a t e f ge t ; g 5 p u b l i c v i r t u a l WaitHandle AsyncWaitHandle f ge t ; g 6 p u b l i c v i r t u a l bool Compl e t edSynchronous l y f ge t ; g 7 p u b l i c v i r t u a l bool I sCompl e t ed f ge t ; g 8 9 // p o z o s t a l e wl a s c iwo s c i 10 p u b l i c bool En d I n v o k eCa l l e d f ge t ; s e t ; g 11 p u b l i c v i r t u a l o b j e c t As yncDe l ega t e f ge t ; g 12 13 . . . 14 g namespace System.Runtime.Remoting.Messaging Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 49 / 61
  • 84. Wywołania asynchroniczne Tradycyjny model asynchroniczny Uzycie AsyncResult 1 p u b l i c c l a s s C a l c u l a t o r C l i e n t 2 f 3 IAs y n cRe s u l t a s y n cRe s u l t ; 45 p u b l i c void AsyncAdd ( ) 6 f 7 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 8 DispatchAdd ( c a l c u l a t o r , 2 , 3 ) ; 9 / j a k a s pr a c a / 10 i n t r e s u l t = Ge tRe s u l t ( ) ; 11 Debug . As s e r t ( r e s u l t == 5) ; 12 g 13 void DispatchAdd ( C a l c u l a t o r c a l c u l a t o r , i n t number1 , i n t number2 ) 14 f 15 Bi n a r yOp e r a t i o n oppDel = c a l c u l a t o r . Add ; 16 a s y n cRe s u l t = oppDel . Be g inInv o k e ( 2 , 3 , n u l l , n u l l ) ; 17 g 18 i n t Ge tRe s u l t ( ) 19 f 20 i n t r e s u l t = 0 ; 21 22 As yncRe sul t a s y n cRe s u l t = ( As yncRe sul t ) a s y n cRe s u l t ; 23 Bi n a r yOp e r a t i o n oppDel = ( Bi n a r yOp e r a t i o n ) a s y n cRe s u l t . As yncDe l ega t e ; 24 25 Debug . As s e r t ( a s y n cRe s u l t . En d I n v o k eCa l l e d == f a l s e ) ; 26 r e s u l t = oppDel . EndInvoke ( a s y n cRe s u l t ) ; 27 r e t u r n r e s u l t ; 28 g 29 g Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 50 / 61
  • 85. Wywołania asynchroniczne Tradycyjny model asynchroniczny Blokowanie 1 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 2 Bi n a r yOp e r a t i o n oppDel = c a l c u l a t o r . Add ; 3 4 IAs y n cRe s u l t a s y n cRe s u l t = oppDel . Be g inInv o k e ( 2 , 3 , n u l l , n u l l ) ; 5 6 / j a k a s pr a c a / 7 8 a s y n cRe s u l t . AsyncWaitHandle .WaitOne ( ) ; //mozliwa blok ada 9 10 i n t r e s u l t ; 11 r e s u l t = oppDel . EndInvoke ( a s y n cRe s u l t ) ; // bez bl ok ady 12 Debug . As s e r t ( r e s u l t == 5) ; Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 51 / 61
  • 86. Wywołania asynchroniczne Tradycyjny model asynchroniczny Sprawdzanie dostepnosci 1 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 2 Bi n a r yOp e r a t i o n oppDel = c a l c u l a t o r . Add ; 3 4 IAs y n cRe s u l t a s y n cRe s u l t = oppDel . Be g inInv o k e ( 2 , 3 , n u l l , n u l l ) ; 5 6 wh i l e ( a s y n cRe s u l t . I sCompl e t ed == f a l s e ) 7 f 8 a s y n cRe s u l t . AsyncWaitHandle .WaitOne (10 , f a l s e ) ; //mozliwa blok ada 9 / j a k a s pr a c a / 10 g 11 12 i n t r e s u l t ; 13 r e s u l t = oppDel . EndInvoke ( a s y n cRe s u l t ) ; // bez bl ok ady 14 Debug . As s e r t ( r e s u l t == 5) ; Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 52 / 61
  • 87. Wywołania asynchroniczne Tradycyjny model asynchroniczny Czekanie na zakonczenie operacji 1 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 2 Bi n a r yOp e r a t i o n oppDel1 = c a l c u l a t o r . Add ; 3 Bi n a r yOp e r a t i o n oppDel2 = c a l c u l a t o r . Add ; 4 5 IAs y n cRe s u l t a s y n cRe s u l t 1 = oppDel1 . Be g inInv o k e ( 2 , 3 , n u l l , n u l l ) ; 6 IAs y n cRe s u l t a s y n cRe s u l t 2 = oppDel2 . Be g inInv o k e ( 4 , 5 , n u l l , n u l l ) ; 7 8 WaitHandle [ ] h a n d l eAr r a y = f a s y n cRe s u l t 1 . AsyncWaitHandle , 9 a s y n cRe s u l t 2 . AsyncWaitHandle g ; 10 11 WaitHandle . Wa i tAl l ( h a n d l eAr r a y ) ; 12 // i n t i d x = WaitHandle .WaitAny ( h a n d l eAr r a y ) ; 13 14 i n t r e s u l t ; 15 16 r e s u l t = oppDel1 . EndInvoke ( a s y n cRe s u l t 1 ) ; // bez bl o k ady 17 Debug . As s e r t ( r e s u l t == 5) ; 18 19 r e s u l t = oppDel2 . EndInvoke ( a s y n cRe s u l t 2 ) ; // bez bl o k ady 20 Debug . As s e r t ( r e s u l t == 9) ; Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 53 / 61
  • 88. Wywołania asynchroniczne Tradycyjny model asynchroniczny Idea wywołan zwrotnych Uruchomienie operacji „w tle” Wywołanie zadanej metody po ukonczeniu operacji „w tle” Sygnatura: void Nazwa(IAsyncResult asyncResut) Przekazanie metody zwrotnej w BeginInvoke() Standardowy delegat: public delegate void AsyncCallback(IAsyncResult asyncResult); Preferowany mechanizm programowania asynchronicznego w modelu tradycyjnym Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 54 / 61
  • 89. Wywołania asynchroniczne Tradycyjny model asynchroniczny Uzycie wywołania zwrotnego 1 p u b l i c c l a s s C a l c u l a t o r C l i e n t 2 f 3 p u b l i c void AsyncAdd ( ) 4 f 5 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 6 Bi n a r yOp e r a t i o n oppDel = c a l c u l a t o r . Add ; 7 oppDel . Be g inInv o k e ( 2 , 3 , OnMethodCompletion , n u l l ) ; 8 g 9 void OnMethodCompletion ( IAs y n cRe s u l t a s y n cRe s u l t ) 10 f 11 i n t r e s u l t = 0 ; 12 13 As yncRe sul t r e s u l tOb j = ( As yncRe sul t ) a s y n cRe s u l t ; 14 15 Debug . As s e r t ( r e s u l tOb j . En d I n v o k eCa l l e d == f a l s e ) ; 16 Bi n a r yOp e r a t i o n oppDel = ( Bi n a r yOp e r a t i o n ) 17 r e s u l tOb j . As yncDe l ega t e ; 18 19 r e s u l t = oppDel . EndInvoke ( a s y n cRe s u l t ) ; 20 Trace . Wr i t eLi n e ( ”Zwrocona wa r t o s c to ” + r e s u l t ) ; 21 g 22 g Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 55 / 61
  • 90. Wywołania asynchroniczne Tradycyjny model asynchroniczny Przekazywanie parametru 1 p u b l i c c l a s s C a l c u l a t o r C l i e n t 2 f 3 p u b l i c void AsyncAdd ( ) 4 f 5 C a l c u l a t o r c a l c u l a t o r = new C a l c u l a t o r ( ) ; 6 Bi n a r yOp e r a t i o n oppDel = c a l c u l a t o r . Add ; 7 i n t a s y n cSt a t e = 4 ; 8 oppDel . Be g inInv o k e ( 2 , 3 , OnMethodCompletion , a s y n cSt a t e ) ; 9 g 10 void OnMethodCompletion ( IAs y n cRe s u l t a s y n cRe s u l t ) 11 f 12 i n t a s y n cSt a t e ; 13 a s y n cSt a t e = ( i n t ) a s y n cRe s u l t . As yncSt a t e ; 14 Debug . As s e r t ( a s y n cSt a t e == 4) ; 15 16 / r e s z t a wywolania zwrotnego / 17 g 18 g Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 56 / 61
  • 91. Wywołania asynchroniczne Tradycyjny model asynchroniczny Informacje dodatkowe Para operacji BeginNazwa(...) i EndNazwa(...) w wielu klasach Stream Web.Services Przechwytywanie błedów wokół EndInvoke() Asynchroniczna publikacja zdarzen listowanie delegatów wywołanie BeginInvoke() FireAsync() z EventsHelper Problemy wielowatkowosci synchronizacja wyczerpanie puli watków przedwczesne uzycie wyników zwalnianie zasobów Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 57 / 61
  • 92. Podsumowanie Plan wykładu 1 Zdarzenia Delegaty Praca ze zdarzeniami 2 Wywołania asynchroniczne Uproszczony model asynchroniczny Dostrajanie Tradycyjny model asynchroniczny Delegaty Programowanie asynchroniczne 3 Podsumowanie Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 58 / 61
  • 93. Podsumowanie Podsumowanie Dwa gotowe mechanizmy do wykorzystania zdarzenia wywołania asynchroniczne Delegaty rulez! Modele programowania i konwencje A za tydzien. . . Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 59 / 61
  • 94. Podsumowanie Do domu Przeczytac 6. i 7. rozdział „Programming .NET Components” Przeczytac „Asynchronous Programming with Async and Await” z MSDN Zapoznac sie z mechanizmem zdarzen i modelami programowania asynchronicznego Zapoznac sie z wzorcem MVVM i jego praktycznym zastosowaniem w WPF Opanowac tworzenie kontrolek uzytkownika w WPF Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 60 / 61
  • 95. Podsumowanie Mikołaj Olszewski (WZIM SGGW) Programowanie Komponentowe Wykład #7 61 / 61