MVVM パターンを使用して、Windows ストアと Windows Phone 8 の両方で同じアプリの 2 つのバージョンを開発しています。各アプリには独自のビューがあります。Model と ViewModel は Portable Class Libraray で共有されます。TPL タスクを使用して、モデル内で非同期操作を行っています。ポータブル クラス ライブラリの制限により、async キーワードと await キーワードを使用できません。
Task が終了したら、UI スレッドに戻っていくつかのプロパティを更新したいと考えています (これにより、ViewModel と View も更新されます)。
これは非常に一般的な状況のように思えるので、なぜそれほど難しいことが判明したのか、少し混乱しています。
私は2つの異なるアプローチを試みました:
1つ(機能しません)
操作を開始する前にスケジューラへの参照を保存します
TaskScheduler scheduler = TaskScheduler.FromCurrentSynchronizationContext();
それをContinueWith
メソッドに渡します。
myTask.ContinueWith(t => myTaskCompleted(t.Result), scheduler);
これは良い解決策のように思えますが、うまくいきません。myTaskCompleted は引き続き別のスレッドで実行されます。
2番
今、私は使用しようとしました
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, handler);
PCL から Dispatcher を直接使用することはできないため、(ラッパーに隠されている) Dispatcher への参照をモデル内のほぼすべてのオブジェクトに渡します。(この回答のように)これは最終的に機能しますが、非常に複雑で醜いです。
だから私の質問は:
- ポータブル クラス ライブラリ内の UI スレッドに戻るための推奨される方法はどれですか?
- 試行Oneでの私の間違いは何ですか?
このトピックにはすでに多くの質問があることは知っていますが、残念ながら私の問題を本当に解決するものは何もありません.