Wpf dispatcher ΡΡΠΎ ΡΡΠΎ
ΠΠ»Π°ΡΡ DispatcherObject
ΠΠΎΠ»ΡΡΡΡ ΡΠ°ΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²Ρ Π½Π΅ Π±ΡΠ΄Π΅ΡΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ Ρ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠΎΠΌ Π½Π°ΠΏΡΡΠΌΡΡ. ΠΠ΄Π½Π°ΠΊΠΎ Π½Π΅ΠΌΠ°Π»ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΡΡΠ°ΡΠΈΡΡ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² DispatcherObject, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ WPF Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΡΡΡ ΠΎΡ ΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°. DispatcherObject β ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΏΡΠΈΠ²ΡΠ·Π°Π½Π½ΡΠΉ ΠΊ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΡ. ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ β ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΏΡΠΈΠ²ΡΠ·Π°Π½Π½ΡΠΉ ΠΊ ΠΏΠΎΡΠΎΠΊΡ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠ°.
DispatcherObject ΠΈΠΌΠ΅Π΅Ρ Π²ΡΠ΅Π³ΠΎ ΡΡΠΈ ΡΠ»Π΅Π½Π°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Ρ Π² ΡΠ°Π±Π»ΠΈΡΠ΅:
ΠΠΌΡ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
---|---|
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.
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Β», ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΊΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
Π ΠΈΡ. 2. ΠΠΈΠ°Π»ΠΎΠ³ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, Π²ΡΠ·Π²Π°Π½Π½ΠΎΠ³ΠΎ Π½Π΅Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΌ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π² Π΄ΡΡΠ³ΠΎΠΉ
Π ΠΈΡ. 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).