我有一个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方法。问题是因为这是从我正在获得此异常的其他任务的上下文中发生的。
“当前的synccontext可能不会用作任务计划程序”
我尝试使用TaskCreationOptions.AttachedToParent
将任务加入到父任务中,但这并不能解决问题。
我想的越多,我认为我应该将Task
创作移动到我的ViewModel,这似乎是最合乎逻辑和最正确的地方,但是有些东西我不知道这意味着我不知道在这种情况下不得不这样做吗?