Wpf dispatcher Ρ‡Ρ‚ΠΎ это

Класс DispatcherObject

Π‘ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π²Ρ‹ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с диспСтчСром Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ. Однако Π½Π΅ΠΌΠ°Π»ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ придСтся Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π½Π° использованиС экзСмпляров DispatcherObject, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ WPF наслСдуСтся ΠΎΡ‚ этого класса. DispatcherObject β€” это просто ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, привязанный ΠΊ диспСтчСру. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, привязанный ΠΊ ΠΏΠΎΡ‚ΠΎΠΊΡƒ диспСтчСра.

DispatcherObject ΠΈΠΌΠ΅Π΅Ρ‚ всСго Ρ‚Ρ€ΠΈ Ρ‡Π»Π΅Π½Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ пСрСчислСны Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅:

Π§Π»Π΅Π½Ρ‹ класса DispatherObject

ИмяОписаниС
DispatherΠ’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ диспСтчСр, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ.
CheckAccess()Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли ΠΊΠΎΠ΄ находится Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ для использования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ false.
VerifyAccess()НичСго Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚, Ссли ΠΊΠΎΠ΄ находится Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ для использования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ InvalidOperationException.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ WPF часто Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ VerifyAccess(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ сСбя. Они Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ VerifyAccess() Π² ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это Π±Ρ‹Π»ΠΎ Π±Ρ‹ слишком Π½Π°ΠΊΠ»Π°Π΄Π½ΠΎ ΠΏΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ), Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ достаточно часто, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΎ маловСроятным Π΄ΠΎΠ»Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ· Π½Π΅Π²Π΅Ρ€Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° Ρ‰Π΅Π»Ρ‡ΠΎΠΊ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ΅, создавая Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ System.Threading.Thread. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ этот ΠΏΠΎΡ‚ΠΎΠΊ для Π²Ρ‹Π·ΠΎΠ²Π° нСбольшого Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ измСняСт тСкстовоС ΠΏΠΎΠ»Π΅ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΎΠΊΠ½Π΅:

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Π·Π°Π΄ΡƒΠΌΠ°Π½ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π΄Π°Ρ‚ΡŒ сбой. ΠœΠ΅Ρ‚ΠΎΠ΄ UpdateTextWrong() Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Π² Π½ΠΎΠ²ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ доступ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ WPF. Π’ этом случаС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ TextBox ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅, вызывая VerifyAccess(), ΠΏΡ€ΠΈ этом гСнСрируСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ InvalidOperationException.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄, понадобится ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ссылку Π½Π° диспСтчСр, Π²Π»Π°Π΄Π΅ΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ TextBox (Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый диспСтчСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π»Π°Π΄Π΅Π΅Ρ‚ ΠΎΠΊΠ½ΠΎΠΌ ΠΈ всСми ΠΏΡ€ΠΎΡ‡ΠΈΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ WPF Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ). ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ² доступ ΠΊ этому диспСтчСру, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Dispatcher.BeginInvoke(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΡ‚ΠΎΠΊΡƒ диспСтчСра. По сути, BeginInvoke() ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² качСствС Π·Π°Π΄Π°Ρ‡ΠΈ для диспСтчСра. Π—Π°Ρ‚Π΅ΠΌ диспСтчСр выполняСт этот ΠΊΠΎΠ΄. НиТС ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄:

ΠœΠ΅Ρ‚ΠΎΠ΄ Dispatcher.BeginInvoke() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ свойство Π·Π°Π΄Π°Ρ‡ΠΈ. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ DispatcherPriority.Normal, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΈΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚, Ссли Π΅ΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Π°, которая Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚ΡŒ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΠ³Π΄Π° диспСтчСру Π½Π΅Ρ‡Π΅Π³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ.

НапримСр, это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ смысл, Ссли Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ сообщСниС ΠΎ состоянии Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΉΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π³Π΄Π΅-Ρ‚ΠΎ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса. МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ DispatcherPriority.ApplicationIdle, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ всю ΠΏΡ€ΠΎΡ‡ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π»ΠΈΠ±ΠΎ Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ «ΡΠ΄Π΅Ρ€ΠΆΠ°Π½Π½Ρ‹ΠΉ» ΠΌΠ΅Ρ‚ΠΎΠ΄ DispatcherPriority.SystemIdle, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° вся систСма Π½Π΅ ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ Π² состояниС оТидания, ΠΈ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ процСссор Π½Π΅ станСт ΠΏΡ€ΠΎΡΡ‚Π°ΠΈΠ²Π°Ρ‚ΡŒ.

ДопускаСтся Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ½ΠΈΠΆΠ΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π²Π»Π΅Ρ‡ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ диспСтчСра Π½Π° Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Однако рСкомСндуСтся ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ высокиС ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρ‹ для событий Π²Π²ΠΎΠ΄Π° (Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ наТатия клавиш). Они Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΡ‡Ρ‚ΠΈ постоянно, ΠΈΠ»ΠΈ ΠΆΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ нСсколько ΠΌΠ΅Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… миллисСкунд ΠΊΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ DispatcherPriority.Normal Π±ΠΎΠ»Π΅Π΅ ΠΎΠΏΡ€Π°Π²Π΄Π°Π½ Π² Ρ‚Π°ΠΊΠΎΠΉ ситуации.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ BeginInvoke() β€” это Π΄Π΅Π»Π΅Π³Π°Ρ‚, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ с ΠΊΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π³Π΄Π΅-Ρ‚ΠΎ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС ΠΊΠΎΠ΄Π°, ΠΈΠ»ΠΈ ΠΆΠ΅ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ встроСнным (ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅). ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π° основС встроСнного ΠΊΠΎΠ΄Π° Ρ…ΠΎΡ€ΠΎΡˆ для простых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΉ строкС. Однако Ссли Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТный процСсс для обновлСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса, Π»ΡƒΡ‡ΡˆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ вынСсти Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄.

ΠœΠ΅Ρ‚ΠΎΠ΄ BeginInvoke() Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ. BeginInvoke() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ DispatcherOperation, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ состояниС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ΄ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±Ρ‹Π» Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½. Однако DispatcherOperation примСняСтся Ρ€Π΅Π΄ΠΊΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдаСтся BeginInvoke(), Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π·Π° ΠΎΡ‡Π΅Π½ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅ врСмя.

ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ фоновая опСрация Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΡ‚ΠΎΠΊΡƒ диспСтчСра (ΠΈ Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ раздСляСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚). НС ΠΈΠΌΠ΅Π΅Ρ‚ смысла Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдаСтся BeginInvoke(). НапримСр, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ слСгка Ρ€Π΅ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ ΠΌΠ΅Π½Π΅Π΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅Π½:

Π—Π΄Π΅ΡΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ вся Ρ€Π°Π±ΠΎΡ‚Π° происходит Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ диспСтчСра. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ Π·Π°ΠΉΠΌΠ΅Ρ‚ диспСтчСр ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ это происходило Π±Ρ‹ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π±Π΅Π· многопоточности.

ДиспСтчСр Ρ‚Π°ΠΊΠΆΠ΅ прСдоставляСт ΠΌΠ΅Ρ‚ΠΎΠ΄ Invoke(). Подобно BeginInvoke(), ΠΎΠ½ ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΡ‚ΠΎΠΊΡƒ диспСтчСра. Но Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ BeginInvoke(), ΠΌΠ΅Ρ‚ΠΎΠ΄ Invoke() останавливаСт ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° диспСтчСр выполняСт ΠΊΠΎΠ΄. ΠœΠ΅Ρ‚ΠΎΠ΄ Invoke() ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ссли Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π΅ поступит ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΎΡ‚ΠΊΠ»ΠΈΠΊ.

НапримСр, ΠΌΠ΅Ρ‚ΠΎΠ΄ Invoke() ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ для запуска Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π°, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‰Π΅Π³ΠΎ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ с ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ ОК ΠΈ Cancel. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ‰Π΅Π»ΠΊΠ½Π΅Ρ‚ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ΅ ΠΈ ΠΌΠ°Ρ€ΡˆΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ, Invoke() Π²Π΅Ρ€Π½Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π² соотвСтствии с ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Before we learn what is dispatcher and why we need it, we need to understand what is the apartments of the Thread.

Thread Apartments

All objects in the process are grouped into Apartments.

There are two types of apartments in Threads:

Single-Threaded Apartment (STA)

Single-threaded apartments contains only one thread. All objects in this apartment can receive method calls from only this thread. Objects does not need synchronization because all methods calls are comes synchronously from single thread.

Single-threaded apartment needs a message queue to handle calls from other threads. When other threads calls an object in STA thread then the method call are queued in the message queue and STA object will receive a call from that message queue.

Multi-Threaded Apartment (MTA)

Multi-threaded apartments contains one or more threads. All objects in this apartment can receive calls from any thread. All objects are self responsible for maintaining the synchronization of their data.

WPF Dispatcher

A WPF application must start in single-threaded apartment thread. STA have a message queue to synchronize method calls within his apartment. As well as other threads outside the apartment can’t update the objects directly. They must place their method call into the message queue to update the objects in STA.

Dispatcher owns the message queue for the STA thread.

When you execute a WPF application, it automatically create a new Dispatcher object and calls its Run method. Run method is used for initializing the message queue.

When WPF application starts, it creates two threads:

UI thread is responsible all the user inputs, handle events, paints screen and run the application code. Render threads runs in the background and used for render the WPF screen.

WPF Dispatcher is associated with the UI thread. The UI thread queues methods call inside the Dispatcher object. Whenever your changes the screen or any event executes, or call a method in the code-behind all this happen in the UI thread and UI thread queue the called method into the Dispatcher queue. Dispatcher execute its message queue into the synchronous order.

How all WPF objects refers to single Dispatcher?

Every WPF control whether it is Window, button or textbox inherits from DispatcherObject. Below is class hierarchy diagram.

Wpf dispatcher Ρ‡Ρ‚ΠΎ это. wpf class hierarchy 5. Wpf dispatcher Ρ‡Ρ‚ΠΎ это Ρ„ΠΎΡ‚ΠΎ. Wpf dispatcher Ρ‡Ρ‚ΠΎ это-wpf class hierarchy 5. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° Wpf dispatcher Ρ‡Ρ‚ΠΎ это. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° wpf class hierarchy 5

When WPF creates an instance of Button, it calls the protected constructor of DispatcherObject. DispatcherObject contains a property of type Dispatcher. In the constructor, it save the reference of current thread Dispatcher to Dispatcher property of DispatcherObject.

Why we need Dispatcher?

WPF works with Dispatcher object behind the scenes and we don’t need to work with Dispatcher when we are working on the UI thread.

When we create a new thread for offloading the work and want to update the UI from the other thread then we must need Dispatcher. Only Dispatcher can update the objects in the UI from non-UI thread.

Dispatcher provides two methods for registering method to execute into the message queue.

Invoke

Invoke method takes an Action or Delegate and execute the method synchronously. That means it does not return until the Dispatcher complete the execution of the method.

Here is an example of Invoke:

Above code will create a new thread using Task.Factory and immediately start the thread. In the InvokeMethodExample if we try to directly call to update the Content property of btn1 object. It will throws a System.InvalidOperationException. We have used Invoke method of Dispatcher. In the Invoke method, I pass the Action and update the Content property of Button object. It will not throws any error and successfully update the Content property.

BeginInvoke

BeginInvoke method take a Delegate but it executes the method asynchronously. That means it immediately returns before calling the method.

BeginInvoke returns a DispatcherOperation object. This object can be used for knowing the status of operation whether it is completed or not. It also provides two event Aborted and Completed.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

МодСль STA

Как извСстно ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° WPF ΠΊΠΎΡ€Π΅Π½Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»Π° ΠΏΠΎΡ‡Ρ‚ΠΈ всС основы программирования для Windows. Она ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ»Π° Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊΠΎ всСму β€” ΠΎΡ‚ опрСдСлСния содСрТимого ΠΎΠΊΠ½Π° Π΄ΠΎ отобраТСния Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ. ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° WPF Π΄Π°ΠΆΠ΅ прСдставила Π½ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ сосрСдоточСнными Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ интСрфСйсС, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ свойства зависимости ΠΈ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ события.

ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ

ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ β€” это искусство выполнСния Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π° ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. ЦСлью многопоточности ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ являСтся созданиС Π±ΠΎΠ»Π΅Π΅ ΠΎΡ‚Π·Ρ‹Π²Ρ‡ΠΈΠ²ΠΎΠ³ΠΎ интСрфСйса β€” Ρ‚Π°ΠΊΠΎΠ³ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ «Π·Π°ΠΌΠΎΡ€Π°ΠΆΠΈΠ²Π°Π΅Ρ‚ся» Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹, β€” хотя ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»Π½Π΅Π΅ Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ прСимущСства двухядСрного процСссора ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ рСсурсоСмких Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ вычислСния Π² процСссС оТидания ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΎΡ‚ Π²Π΅Π±-слуТбы).

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ WPF ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ Ρ€ΠΎΠ΄ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ (thread affinity). ΠŸΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт ΠΈΡ…, Π²Π»Π°Π΄Π΅Π΅Ρ‚ ΠΈΠΌΠΈ, ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с Π½ΠΈΠΌΠΈ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ. (Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ WPF, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹ΠΉ Π² ΠΎΠΊΠ½Π΅.)

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ WPF, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠΉ Ρ€ΠΎΠ΄ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ, Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ DispatcherObject Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅ ΠΈΡ… ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ классов. DispatcherObject Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ нСбольшой Π½Π°Π±ΠΎΡ€ Ρ‡Π»Π΅Π½ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Π΅Ρ€ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, выполняСтся Π»ΠΈ ΠΊΠΎΠ΄ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΈ (Ссли Π½Π΅Ρ‚) ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ.

На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ выполняСт всС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π²Π»Π°Π΄Π΅Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ WPF. Π₯отя ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΊΠ½Π°, Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ встрСчаСтся Ρ€Π΅Π΄ΠΊΠΎ.

ДиспСтчСр

ДиспСтчСр управляСт Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ, происходящСй Π² WPF-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. ДиспСтчСр Π²Π»Π°Π΄Π΅Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ прилоТСния ΠΈ управляСт ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒΡŽ элСмСнтов Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π’ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния диспСтчСр ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹Π΅ запросы Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ выполняСт ΠΈΡ… ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ.

Π€ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ диспСтчСр создаСтся ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌ создании Π² Π½ΠΎΠ²ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ экзСмпляра класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ наслСдуСтся ΠΎΡ‚ DispatcherObject. Π’ случаС создания ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ использования ΠΈΡ… для отобраТСния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΊΠΎΠ½ получаСтся Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ диспСтчСра. Однако Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π΅ ΡƒΡΠ»ΠΎΠΆΠ½ΡΡŽΡ‚ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρƒ ΠΈ обходятся ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса ΠΈ ΠΎΠ΄Π½ΠΈΠΌ диспСтчСром. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ для управлСния опСрациями с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΌΠΈ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ диспСтчСризация Π² MVVM-прилоТСниях

ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹ ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ:

Windows 8, MVVM Light Toolkit, Visual Studio, Windows Phone, Windows Presentation Foundation

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π³ΠΎΠ΄ Π½Π°Π·Π°Π΄ я Π½Π°Ρ‡Π°Π» ΡΠ΅Ρ€ΠΈΡŽ статСй ΠΏΠΎ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ Model-View-ViewModel (MVVM) для Π²Π΅Π±-сайта MSDN Magazine (всС ΠΎΠ½ΠΈ доступны ΠΏΠΎ ссылкС is.gd/mvvmmsdn). Π’ этих ΡΡ‚Π°Ρ‚ΡŒΡΡ… Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ MVVM Light Toolkit для создания слабо связанных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² соотвСтствии с Π΄Π°Π½Π½Ρ‹ΠΌ шаблоном. Π― исслСдовал встраиваниС зависимостСй (dependency injection, DI) ΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ IOC-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² (Inversion of Control) (Π² Ρ‚ΠΎΠΌ числС MVVM Light SimpleIoc), рассказал ΠΎ Messenger ΠΈ обсудил сСрвисы View, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Navigation, Dialog ΠΈ Π΄Ρ€. Π― Ρ‚Π°ΠΊΠΆΠ΅ продСмонстрировал, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ этапа проСктирования, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² максимально ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΌΠ΅Ρ€Π΅ Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄ΠΈΠ·Π°ΠΉΠ½Π΅Ρ€Ρ‹ Π²Ρ€ΠΎΠ΄Π΅ Blend, ΠΈ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠ» ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ… RelayCommand ΠΈ EventToCommand, Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ событий для ослаблСния связи ΠΌΠ΅ΠΆΠ΄Ρƒ View ΠΈ Π΅Π³ΠΎ ViewModel.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Ρ…ΠΎΡ‡Ρƒ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ распространСнный сцСнарий Π² соврСмСнных клиСнтских прилоТСниях: ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ обСспСчСниС взаимодСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ. ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ становится всС Π²Π°ΠΆΠ½Π΅Π΅ Π² соврСмСнных ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Windows 8, Windows Phone, Windows Presentation Foundation (WPF), Silverlight ΠΈ Π΄Ρ€. На ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· этих ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ β€” Π΄Π°ΠΆΠ΅ Π½Π° Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ ΠΌΠΎΡ‰Π½ΠΎΠΉ β€” Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠΌΠΈ. По сути, Π½Π° ΠΌΠ°Π»Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… с Π³ΠΎΡ€Π°Π·Π΄ΠΎ мСньшими Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ рСсурсами это Π΄Π°ΠΆΠ΅ Π²Π°ΠΆΠ½Π΅Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ срСду (user experience, UX).

Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° Windows Phone. Π’ самой ΠΏΠ΅Ρ€Π²ΠΎΠΉ вСрсии (Windows Phone 7) Π±Ρ‹Π»ΠΎ довольно Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΏΠ»Π°Π²Π½ΠΎΠΉ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ Π² Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… списках, особСнно ΠΊΠΎΠ³Π΄Π° ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ элСмСнтов содСрТали изобраТСния. Однако Π² Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΡ… вСрсиях Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΉ пСрСдаСтся Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ. Π’ ΠΈΡ‚ΠΎΠ³Π΅, ΠΊΠΎΠ³Π΄Π° загруТаСтся ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, это большС Π½Π΅ влияСт Π½Π° основной ΠΏΠΎΡ‚ΠΎΠΊ, ΠΈ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠ° остаСтся ΠΏΠ»Π°Π²Π½ΠΎΠΉ.

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π°ΠΆΠ½Ρ‹Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я Π±ΡƒΠ΄Ρƒ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅. Начну с ΠΎΠ±Π·ΠΎΡ€Π° Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π² Ρ†Π΅Π»ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² XAML-прилоТСниях.

ΠŸΡ€ΠΎΡ‰Π΅ говоря, ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ мСньшСй Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ выполнСния прилоТСния. ΠšΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ называСтся основным (main thread). Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΡ‚ΠΎΠΊ запускаСтся ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой, ΠΊΠΎΠ³Π΄Π° вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ main прилоТСния; это происходит ΠΏΡ€ΠΈ стартС прилоТСния. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ происходит Π½Π° всСх ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… β€” ΠΊΠ°ΠΊ Π² WPF, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΉ Π½Π° ΠΌΠΎΡ‰Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°Ρ…, Ρ‚Π°ΠΊ ΠΈ Π½Π° устройствах ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Windows Phone с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ рСсурсами.

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° опСрация добавляСтся Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. КаТдая опСрация выполняСтся ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π² соотвСтствии с порядком, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½Π° Π±Ρ‹Π»Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ (хотя Π½Π° порядок выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ, Π½Π°Π·Π½Π°Ρ‡ΠΈΠ² ΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρ‹). ΠžΠ±ΡŠΠ΅ΠΊΡ‚, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒΡŽ, называСтся диспСтчСром ΠΏΠΎΡ‚ΠΎΠΊΠ° (thread’s dispatcher). Π­Ρ‚ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ являСтся экзСмпляром класса Dispatcher Π² WPF, Silverlight ΠΈ Windows Phone. Π’ Windows 8 ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ диспСтчСра называСтся CoreDispatcher ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ нСсколько ΠΈΠ½ΠΎΠΉ API.

ΠŸΡ€ΠΈ нСобходимости ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ β€” ΠΊΠ°ΠΊ явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π² ΠΊΠΎΠ΄Π΅, Ρ‚Π°ΠΊ ΠΈ нСявным, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈΠ»ΠΈ ОБ. Π’ основном Ρ†Π΅Π»ΡŒ запуска Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° β€” Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (ΠΈΠ»ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ) Π±Π΅Π· блокирования ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ части прилоТСния. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒΡΡ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π΅ΠΉ интСнсивных вычислСний, Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Ρ‚. Π΄. ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ соврСмСнных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ постоянно Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ ΠΈΠ·-Π·Π° роста Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ качСствСнной UX. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ прилоТСния становятся Π±ΠΎΠ»Π΅Π΅ слоТными, увСличиваСтся количСство запускаСмых ΠΈΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΠΉ Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΠΈ β€” инфраструктура Windows Runtime, примСняСмая Π² прилоТСниях Windows Store. Π’ этих соврСмСнных клиСнтских прилоТСниях ΠΎΡ‡Π΅Π½ΡŒ распространСны асинхронныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (Ρ‚. Π΅. ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, выполняСмыС Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ). Π’Π°ΠΊ, ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ Π² Windows 8 Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ являСтся асинхронной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ Π² WPF считываСтся Ρ„Π°ΠΉΠ» (синхронно):

А это эквивалСнтная асинхронная опСрация Π² Windows 8:

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° присутствиС ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов await ΠΈ async Π² вСрсии для Windows 8. Они ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ использования ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π² асинхронных опСрациях ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠ΄ Π±Ρ‹Π»ΠΎ Π»Π΅Π³Ρ‡Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ. Π—Π΄Π΅ΡΡŒ ΠΎΠ½ΠΈ Π½ΡƒΠΆΠ½Ρ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ файловая опСрация асинхронная. Π’ WPF-вСрсии, Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ², эта опСрация синхронная, Ρ‡Ρ‚ΠΎ создаСт риск Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ основного ΠΏΠΎΡ‚ΠΎΠΊΠ°, Ссли считываСмый Ρ„Π°ΠΉΠ» окаТСтся Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ прСрывистыми ΠΈΠ»ΠΈ привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ UI пСрСстанСт ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒΡΡ, Ρ‚. Π΅. ΡƒΡ…ΡƒΠ΄ΡˆΠΈΡ‚ΡŒ UX.

Аналогично Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² вашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π½ΠΎΡΠΈΡ‚ΡŒΡΡ Π² Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Ссли Π΅ΡΡ‚ΡŒ риск Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ обновлСнию UI. НапримСр, Π² WPF, Silverlight ΠΈ Windows Phone ΠΊΠΎΠ΄ Π½Π° рис. 1 ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΠ΅Ρ‚ Ρ„ΠΎΠ½ΠΎΠ²ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, которая выполняСтся Π² Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅Π½Π°Π΄ΠΎΠ»Π³ΠΎ пСрСводится Π² спящСС состояниС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Ρ‚ΡŒ врСмя Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ свои ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.

ВзаимодСйствиС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

Когда ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½ΡƒΠΆΠ½ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с Π΄Ρ€ΡƒΠ³ΠΈΠΌ, слСдуСт ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Ρ€Ρ‹ прСдостороТности. НапримСр, я ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽ ΠΊΠΎΠ΄ с рис. 1 Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π» сообщСниС ΠΎ состоянии Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅. Для этого я просто добавлю строку ΠΊΠΎΠ΄Π° Π² Ρ†ΠΈΠΊΠ» while, которая устанавливаСт свойство Text элСмСнта управлСния StatusTextBlock, находящСгося Π² XAML:

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ SimpleMultiThreading Π² ΠΊΠΎΠ΄Π΅, ΡΠΎΠΏΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅, дСмонстрируСт этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Если Π²Ρ‹ запускаСтС Π΅Π³ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠ½ΠΎΠΏΠΊΡƒ Start (crashes the app), Ρ‚ΠΎ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ происходит ΠΊΡ€Π°Ρ…. Π§Ρ‚ΠΎ ΠΆΠ΅ ΡΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ? Когда ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ создаСтся, Π΅Π³ΠΎ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ становится Ρ‚ΠΎΡ‚ ΠΏΠΎΡ‚ΠΎΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±Ρ‹Π» Π²Ρ‹Π·Π²Π°Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ конструктора. Π’ случаС UI-элСмСнтов ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ XAML (XAML parser) ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ XAML-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°. ВсС это происходит Π² основном ΠΏΠΎΡ‚ΠΎΠΊΠ΅. Π’ ΠΈΡ‚ΠΎΠ³Π΅ всС UI-элСмСнты ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ основному ΠΏΠΎΡ‚ΠΎΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ UI-ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ. Когда Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅ пытаСтся ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свойство Text элСмСнта StatusTextBlock, обнаруТиваСтся нСдопустимоС ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. Как слСдствиС, гСнСрируСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, выполняя Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅. На рис. 2 ΠΏΠΎΠΊΠ°Π·Π°Π½ Π΄ΠΈΠ°Π»ΠΎΠ³ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° сообщСниС Β«Additional informationΒ», ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΡ€Π΅Π½ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

Wpf dispatcher Ρ‡Ρ‚ΠΎ это. dn630646.Bugnion Figure%202 hires(ru ru,MSDN.10). Wpf dispatcher Ρ‡Ρ‚ΠΎ это Ρ„ΠΎΡ‚ΠΎ. Wpf dispatcher Ρ‡Ρ‚ΠΎ это-dn630646.Bugnion Figure%202 hires(ru ru,MSDN.10). ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° Wpf dispatcher Ρ‡Ρ‚ΠΎ это. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° dn630646.Bugnion Figure%202 hires(ru ru,MSDN.10)

Рис. 2. Π”ΠΈΠ°Π»ΠΎΠ³ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠ³ΠΎ нСдопустимым ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ

Wpf dispatcher Ρ‡Ρ‚ΠΎ это. dn630646.Bugnion Figure%203 hires(ru ru,MSDN.10). Wpf dispatcher Ρ‡Ρ‚ΠΎ это Ρ„ΠΎΡ‚ΠΎ. Wpf dispatcher Ρ‡Ρ‚ΠΎ это-dn630646.Bugnion Figure%203 hires(ru ru,MSDN.10). ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° Wpf dispatcher Ρ‡Ρ‚ΠΎ это. ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° dn630646.Bugnion Figure%203 hires(ru ru,MSDN.10)

Рис. 3. Π˜Π΅Ρ€Π°Ρ€Ρ…ΠΈΡ классов

Рис. 4. ДиспСтчСризация Π²Ρ‹Π·ΠΎΠ²Π° UI-ΠΏΠΎΡ‚ΠΎΠΊΡƒ

ДиспСтчСризация Π² MVVM-прилоТСниях

Когда фоновая опСрация запускаСтся ΠΈΠ· ViewModel, ситуация нСсколько мСняСтся. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ViewModel Π½Π΅ наслСдуСт ΠΎΡ‚ DispatcherObject. ViewModel β€” это POCO-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ (Plain Old CLR Objects), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ интСрфСйс INotifyPropertyChanged. НапримСр, Π½Π° рис. 5 ΠΏΠΎΠΊΠ°Π·Π°Π½ ViewModel, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ класса ViewModelBase ΠΈΠ· MVVM Light. Π’ истинном стилС MVVM я добавляю наблюдаСмоС свойство Status, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ событиС PropertyChanged. Π—Π°Ρ‚Π΅ΠΌ ΠΈΠ· ΠΊΠΎΠ΄Π° Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° я ΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² это свойство ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ΅ сообщСниС.

Рис. 5. ОбновлСниС связанного свойства Π² ViewModel

Если Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ этот ΠΊΠΎΠ΄ Π² Windows Phone ΠΈΠ»ΠΈ Silverlight, ΠΎΠ½ прСкрасно Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΏΠΎΠΊΠ° я Π½Π΅ ΠΏΠΎΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ свойство Status с TextBlock Π² XAML UI. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ вновь ΠΎΠ±Ρ€ΡƒΡˆΠΈΡ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Как ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅, Π΅Π΄Π²Π° Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ попытаСтся ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ элСмСнту, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰Π΅ΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ, Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ происходит, Π΄Π°ΠΆΠ΅ Ссли доступ осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ связывания с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π² WPF Π΄Π΅Π»ΠΎ обстоит ΠΈΠ½Π°Ρ‡Π΅ ΠΈ ΠΊΠΎΠ΄, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½Π° рис. 5, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π΄Π°ΠΆΠ΅ Ссли свойство Status связано с TextBlock. Π­Ρ‚ΠΎ Π²Ρ‹Π·Π²Π°Π½ΠΎ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ WPF автоматичСски направляСт событиС PropertyChanged Π² основной ΠΏΠΎΡ‚ΠΎΠΊ Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… инфраструктур XAML. Π’ΠΎ всСх Π΄Ρ€ΡƒΠ³ΠΈΡ… инфраструктурах трСбуСтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ диспСтчСризации. По сути, трСбуСтся систСма, которая ΠΏΡ€ΠΈ нСобходимости диспСтчСризуСт Π²Ρ‹Π·ΠΎΠ². Π§Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠ΄ ViewModel ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π² WPF, ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… инфраструктурах ΠΈ Π½Π΅ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ диспСтчСризации, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Π»Π°Π» Π±Ρ‹ это автоматичСски.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ViewModel являСтся POCO, Ρƒ Π½Π΅Π³ΠΎ Π½Π΅Ρ‚ доступа ΠΊ свойству Dispatcher, поэтому ΠΌΠ½Π΅ Π½ΡƒΠΆΠ΅Π½ Π΄Ρ€ΡƒΠ³ΠΎΠΉ способ обращСния ΠΊ основному ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΈ постановки ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. Для этого ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ DispatcherHelper Π² MVVM Light. ЀактичСски этот класс Ρ…Ρ€Π°Π½ΠΈΡ‚ Dispatcher основного ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² статичСском свойствС ΠΈ прСдоставляСт нСсколько Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для доступа ΠΊ Π½Π΅ΠΌΡƒ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΈ Π΅Π΄ΠΈΠ½Ρ‹ΠΌ способом. Π§Ρ‚ΠΎΠ±Ρ‹ класс ΠΌΠΎΠ³ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² основном ΠΏΠΎΡ‚ΠΎΠΊΠ΅. Π’ ΠΈΠ΄Π΅Π°Π»Π΅, это Π΄ΠΎΠ»ΠΆΠ½ΠΎ происходит Π½Π° самом Ρ€Π°Π½Π½Π΅ΠΌ этапС ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° прилоТСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±Ρ‹Π»Π° доступна с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° запуска прилоТСния. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, DispatcherHelper Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ MVVM Light инициализируСтся Π² App.xaml.cs β€” Ρ„Π°ΠΉΠ»Π΅, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅ΠΌ стартовый класс прилоТСния. Π’ Windows Phone Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ DispatcherHelper.Initialize Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ InitializePhoneApplication сразу послС создания основной Ρ€Π°ΠΌΠΊΠΈ ΠΎΠΊΠ½Π° прилоТСния. Π’ WPF этот класс инициализируСтся Π² конструкторС App. Π’ Windows 8 Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ Initialize Π² OnLaunched сразу послС Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠΊΠ½Π°.

По ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° DispatcherHelper.Initialize свойство UIDispatcher класса DispatcherHelper содСрТит ссылку Π½Π° диспСтчСр основного ΠΏΠΎΡ‚ΠΎΠΊΠ°. ΠΠ°ΠΏΡ€ΡΠΌΡƒΡŽ это свойство ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅Π΄ΠΊΠΎ, Π½ΠΎ ΠΏΡ€ΠΈ нСобходимости Ρ‚Π°ΠΊΠΎΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Однако Π»ΡƒΡ‡ΡˆΠ΅ Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ CheckBeginInvokeOnUi. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π΅Π»Π΅Π³Π°Ρ‚ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π½Π° рис. 6, Π½ΠΎ вмСсто Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄.

Рис. 6. ИспользованиС DispatcherHelper для прСдотвращСния ΠΊΡ€Π°Ρ…Π°

Как ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ Π½Π°Π·Π²Π°Π½ΠΈΠ΅, этот ΠΌΠ΅Ρ‚ΠΎΠ΄ сначала выполняСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ. Если ΠΊΠΎΠ΄, Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ этот ΠΌΠ΅Ρ‚ΠΎΠ΄, ΡƒΠΆΠ΅ выполняСтся Π² основном ΠΏΠΎΡ‚ΠΎΠΊΠ΅, Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ диспСтчСризации Π½Π΅ трСбуСтся. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС Π΄Π΅Π»Π΅Π³Π°Ρ‚ выполняСтся Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ β€” прямо Π² основном ΠΏΠΎΡ‚ΠΎΠΊΠ΅. Однако, Ссли ΠΊΠΎΠ΄, Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ этот ΠΌΠ΅Ρ‚ΠΎΠ΄, находится Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, происходит диспСтчСризация.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄ выполняСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΏΠ΅Ρ€Π΅Π΄ диспСтчСризациСй, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ всСгда Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ². Π­Ρ‚ΠΎ особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ кросс-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, Π³Π΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с нСбольшими различиями Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ…. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΊΠΎΠ΄ ViewModel Π½Π° рис. 6 ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Π΄Π΅ ΡƒΠ³ΠΎΠ΄Π½ΠΎ Π±Π΅Π· ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ строки, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ задаСтся свойство Status.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, DispatcherHelper абстрагируСт различия Π² API диспСтчСра ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ XAML. Π’ Windows 8 основныС Ρ‡Π»Π΅Π½Ρ‹ CoreDispatcher β€” это ΠΌΠ΅Ρ‚ΠΎΠ΄ RunAsync ΠΈ свойство HasThreadAccess. Однако Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… инфраструктурах XAML ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ BeginInvoke ΠΈ CheckAccess соотвСтствСнно. ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΡ DispatcherHelper, Π²Π°ΠΌ Π½Π΅ придСтся Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΠ± этих различиях, ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΎΠ±Ρ‰ΠΈΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‰Π΅.

ДиспСтчСризация Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅: Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΈ

Π― ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ DispatcherHelper, создав ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Windows Phone для Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ° компаса.

Π’ ΡΠΎΠΏΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΊΠΎΠ΄Π΅ Π΅ΡΡ‚ΡŒ набросок прилоТСния ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Β«CompassSample – StartΒ». ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ это ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Visual Studio ΠΈ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ доступ ΠΈΠ· MainViewModel ΠΊ Π΄Π°Ρ‚Ρ‡ΠΈΠΊΡƒ компаса инкапсулирован Π² сСрвисС SensorService, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ интСрфСйса ISensorService. Π­Ρ‚ΠΈ Π΄Π²Π° элСмСнта Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π² ΠΏΠ°ΠΏΠΊΠ΅ Model.

MainViewModel ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ссылку Π½Π° ISensorService Π² своСм конструкторС ΠΈ рСгистрируСтся Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² показаниях компаса, вызывая ΠΌΠ΅Ρ‚ΠΎΠ΄ SensorService RegisterForHeading. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π΄Π°Ρ‚Ρ‡ΠΈΠΊ сообщаСт ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π² Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ устройства ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Windows Phone. Π’ MainViewModel Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ конструктор ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ:

К соТалСнию, Π² эмуляторС Windows Phone Π½Π΅Ρ‚ возмоТности ΡΡ‹ΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΉ компас. Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ΄Π° придСтся Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° физичСском устройствС. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ это устройство ΠΈ запуститС ΠΊΠΎΠ΄ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, Π½Π°ΠΆΠ°Π² F5. ΠΠ°Π±Π»ΡŽΠ΄Π°ΠΉΡ‚Π΅ Π·Π° ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹ΠΌ ΠΎΠΊΠ½ΠΎΠΌ Output Π² Visual Studio. Π’Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π²Ρ‹Π²ΠΎΠ΄ Compass. Если Π²Ρ‹ ΠΏΠΎΠ΄Π²ΠΈΠ³Π°Π΅Ρ‚Π΅ устройство, Ρ‚ΠΎ смоТСтС Π½Π°ΠΉΡ‚ΠΈ сСвСр ΠΈ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ постоянно ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Π—Π°Ρ‚Π΅ΠΌ я свяТу TextBlock Π² XAML со свойством Heading Π² MainViewModel. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ MainPage.xaml ΠΈ Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ TextBlock Π² ContentPanel. Π—Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ Β«Nothing yetΒ» Π² свойствС Text Π½Π° «». Если Π²Ρ‹ снова запуститС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ€ΡƒΡ…Π½Π΅Ρ‚ с сообщСниСм ΠΎΠ± ошибкС, ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Ρ€Π°Π½Π΅Π΅. И вновь это ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ·-Π·Π° Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ взаимодСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ.

Ошибка Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π΄Π°Ρ‚Ρ‡ΠΈΠΊ компаса обрабатываСтся Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ. Когда запускаСтся ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ², ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ выполняСтся Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΊΠ°ΠΊ ΠΈ аксСссор set свойства Heading. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ TextBlock ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ основному ΠΏΠΎΡ‚ΠΎΠΊΡƒ, гСнСрируСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Π—Π΄Π΅ΡΡŒ Ρ‚ΠΎΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Β«Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡƒΡŽ Π·ΠΎΠ½ΡƒΒ» β€” ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ диспСтчСризации ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² основной ΠΏΠΎΡ‚ΠΎΠΊ. Для этого ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ класс SensorService. Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ CurrentValueChanged обрабатываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ CompassCurrentValueChanged; ΠΊΠ°ΠΊ Ρ€Π°Π· Π² Π½Π΅ΠΌ выполняСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°. Π—Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ этот ΠΊΠΎΠ΄ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π½ΠΈΠΆΠ΅, Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ DispatcherHelper:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ DispatcherHelper. Для этого ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ App.xaml.cs ΠΈ Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ InitializePhoneApplication. Π’ самый ΠΊΠΎΠ½Π΅Ρ† этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ DispatcherHelper.Initialize();. Π’Π΅ΠΏΠ΅Ρ€ΡŒ запуск ΠΊΠΎΠ΄Π° даст ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ отобраТая Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ устройства Windows Phone.

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π² Windows Phone Π½Π΅ всС Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ свои события Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅. НапримСр, Π΄Π°Ρ‚Ρ‡ΠΈΠΊ GeoCoordinateWatcher, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для отслСТивания гСопозиционирования устройства, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ показания Π² основной ΠΏΠΎΡ‚ΠΎΠΊ для вашСго удобства. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ DispatcherHelper, Π²Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΠ± этом ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ всСгда Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² основного ΠΏΠΎΡ‚ΠΎΠΊΠ°.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠŸΠΎΡ‚ΠΎΠΌ я ΠΏΠ΅Ρ€Π΅ΡˆΠ΅Π» ΠΊ MVVM-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΈ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΠ» вас с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ DispatcherHelper ΠΈΠ· MVVM Light Toolkit. Π― ΠΏΠΎΠΊΠ°Π·Π°Π», ΠΊΠ°ΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этого ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ взаимодСйствия ΠΈΠ· Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° с основным ΠΈ ΠΊΠ°ΠΊ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот доступ ΠΈ Π°Π±ΡΡ‚Ρ€Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ различия ΠΌΠ΅ΠΆΠ΄Ρƒ WPF ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ инфраструктурами Π½Π° основС XAML. Π‘Π΄Π΅Π»Π°Π² это, ΠΌΠΎΠΆΠ½ΠΎ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ViewModel ΠΈ ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ Π²Π°ΡˆΡƒ Ρ€Π°Π±ΠΎΡ‚Ρƒ.

НаконСц, я продСмонстрировал практичСский ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ DispatcherHelper ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Windows Phone, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ свои события Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€ΡŽ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Messenger ΠΈΠ· MVVM Light ΠΈ ΠΏΠΎΠΊΠ°ΠΆΡƒ, ΠΊΠ°ΠΊ ΠΎΠ½ позволяСт ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ взаимодСйствиС ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π±Π΅Π· нСобходимости для Π½ΠΈΡ… Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π·Π½Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ ΠΎ Π΄Ρ€ΡƒΠ³Π΅.

Π›Ρ‘Ρ€ΠΎ Π‘ΡƒΠ½ΡŒΠΎΠ½ (Laurent Bugnion) β€” ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ IdentityMine Inc., ΠΏΠ°Ρ€Ρ‚Π½Π΅Ρ€Π° Microsoft, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ с Ρ‚Π°ΠΊΠΈΠΌΠΈ тСхнологиями, ΠΊΠ°ΠΊ Windows Presentation Foundation, Silverlight, Pixelsense, Kinect, Windows 8, Windows Phone ΠΈ UX. Π–ΠΈΠ²Π΅Ρ‚ Π² Π¦ΡŽΡ€ΠΈΡ…Π΅ (ШвСйцария). Π’Π°ΠΊΠΆΠ΅ являСтся ΠΎΠ±Π»Π°Π΄Π°Ρ‚Π΅Π»Π΅ΠΌ Π·Π²Π°Π½ΠΈΠΉ Microsoft MVP ΠΈ Microsoft Regional Director.

Π’Ρ‹Ρ€Π°ΠΆΠ°ΡŽ Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π½ΠΎΡΡ‚ΡŒ Π·Π° Ρ€Π΅Ρ†Π΅Π½Π·ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ экспСрту Microsoft Вомасу ΠŸΠ΅Ρ‚Ρ‡Π΅Π»Ρƒ (Thomas Petchel).

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *