Windows Storeアプリ(WinRT)のViewModelではSynchronizationContextでスレッド同期するのが吉?
Windows PhoneのSilverlightからの習慣でUIスレッドの同期はDispatcher.BeginInvokeやろ、あ、Dispatcher.RunAsyncか...、とやっていたのですが、どうもMetro改め(以下略)WinRTアプリでは様々なシチュエーションでViewModelが呼ばれることが増えているようで、Share Contract内でうっかりAppクラスのスレッドなど呼ぼうものなら玉砕必死です。(あと、await無しでDispatcher.RunAsync()呼ぶと波線付くのも鬱陶しい、非同期投げっぱなししたいときって何か作法があるんでしょうか?)
なので、呼ばれた状況に合わせてスレッドを同期しようよということで、とりあえずSynchronizationContextを使っておくのがシンプルで良いのかな、と。他のプラットフォームにも使いまわしが効きますし。
シンプルなINotifyPropertyChanged実装であれば、↓な感じで。
当然、このままだと同期コンテキストをSynchronizationContext.Currentから引っ張っているため、ViewModelは生成した際のスレッドに同期されるので、生成はUIスレッド上で行う必要があります。色々したければContextをコンストラクタで渡すなりなんなり、と...。
public class HogeViewModel : INotifyPropertyChanged
{
private SynchronizationContext synchronizationContext = SynchronizationContext.Current;//...
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (null != handler)
{
this.synchronizationContext.Post((o) =>
{
handler(this, new PropertyChangedEventArgs(propertyName));
}, null);
}
}
}
Windows8UI/UXデザイン入門code name Metro
- 作者: 泉本優輝,吉竹遼
- 出版社/メーカー: 秀和システム
- 発売日: 2012/09/11
- メディア: 単行本
- 購入: 5人 クリック: 109回
- この商品を含むブログ (7件) を見る
プログラミング.NET FRAMEWORK 第3版 (Microsoft Press)
- 作者: Jeffrey Richter,藤原雄介
- 出版社/メーカー: 日経BP社
- 発売日: 2011/02/03
- メディア: 単行本
- 購入: 10人 クリック: 500回
- この商品を含むブログ (20件) を見る
インサイドWINDOWS 第6版 上 (Microsoft Press)
- 作者: Mark E. Russinovich,David A. Solomon,Alex Ionescu,株式会社クイープ
- 出版社/メーカー: 日経BP社
- 発売日: 2012/10/04
- メディア: 単行本
- 購入: 2人 クリック: 78回
- この商品を含むブログ (7件) を見る