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