「サービス」の概念を持つ WPF MVVM アプリケーションがあります。
各サービス メソッドには、パラメータの 1 つとしてコールバックが渡され、 が作成されTask
、作業が行われ、継続中の ViewModel でコールバックが呼び出されます。
私のサービス方法の 1 つで、「作業」には、データベースを同期し、更新されたデータベースを DB からロードすることが含まれます。別の方法では、テーブル内のレコード数をカウントします。簡単な例を次に示します。
public void GetStudents(Action<IEnumerable<Student>> callback)
{
Task.Run(() =>
{
Sync();
return students;
}).ContinueWith(task =>
{
callback(task.Result);
}, TaskScheduler.FromCurrentSynchronizationContext());
}
public void CountStudents(Action<int> callback)
{
Task.Run(() =>
{
return students.Count();
}).ContinueWith(task =>
{
callback(task.Result);
}, TaskScheduler.FromCurrentSynchronizationContext());
}
これらのメソッドは、異なる ViewModel から個別に呼び出され、期待どおりに機能しました。ただし(常にあるとは限りませんが) Prism を使用して同期が完了したときにイベントを追加しましたEventAggregator
。同期が完了したら、Student テーブルが更新されていれば、カウント メソッドを再実行します。問題は、これが他のタスクのコンテキストから発生しているためです。この例外が発生しています。
「現在の同期コンテキストは、タスクスケジューラとして使用できない可能性があります」
タスクを親タスクに結合しようとしましたTaskCreationOptions.AttachedToParent
が、問題は解決しません。
考えれば考えるほど、作成をViewModelに移動する必要があると思います。Task
それが最も論理的で正しい場所のように思えますが、これでそれを行う必要がないことを意味する何かが欠けていますか?実例?