3

我有一个具有“服务”概念的 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 中,这似乎是最合乎逻辑和最正确的地方,但是我错过了什么意味着我不必在这个实例?

4

0 回答 0