我有一个具有“服务”概念的 WPF MVVM 应用程序。
每个服务方法都作为参数传递一个回调,它创建Task
,完成工作,然后在继续中调用 ViewModel 中的回调。
在我的一种服务方法中,“工作”涉及同步数据库,然后从数据库加载更新的数据库。另一种方法是计算表中的记录数。以下是一些简化的示例。
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 表已更新,我想重新运行 count 方法。问题是因为这是在我收到此异常的其他任务的上下文中发生的。
“当前的同步上下文可能不能用作任务调度程序”
我已经尝试将任务加入到父任务中,TaskCreationOptions.AttachedToParent
但这并不能解决问题。
我想得越多,我认为我应该将Task
创作移到我的 ViewModels 中,这似乎是最合乎逻辑和最正确的地方,但是我错过了什么意味着我不必在这个实例?