1

我最近开始使用带有 MVVM Light Toolkit 的 MVVM 模型在 WPF 上进行开发。

我在 listboxView 中有一个列表框,它有一个 listboxViewModel。在 listboxViewModel 中,我有一个 ObseverableCollection ( items ),它在 setter 中引发了 PropertyChanged。

数据绑定到列表框没有问题。

问题是,当我尝试使用 Task 从我的数据库(在线资源)异步提取数据并更新items时,更改不会反映在 UI 上。

但是,如果我在没有任务的情况下调用该方法,导致 UI 冻结直到数据到达我,UI 会反映更改。

我在任务中使用的代码如下:

            Task.Factory.StartNew(() =>
            {
                return new CCDatabase().CCDB;
            }).ContinueWith(taskState =>
            {
                items = taskState.Result;
            }, TaskScheduler.Default);

这没有任何意义。我最好的猜测是它与任务的上下文有关。但是,当我在项目的设置器中添加断点时,该值是正确的,即 5(5 是我在数据库表中的行数)。

我的问题是,如果我希望更新 UI 并同时获得 UI 的好处,而不是每次调用数据库时都冻结,那该怎么做。

我在 VS2010 中编码,所以我无法使用美妙的 async/await 魔法。我目前正在使用 EntityFramework 6.0 进行数据库调用。

4

1 回答 1

0

在您的ContinueWith操作中,您正在传递default scheduler将从 ThreadPool 获取调度程序。从MSDN文档 -

任务并行库和 PLINQ 的默认调度程序使用 .NET Framework 线程池来排队和执行工作。

而且由于您无法从其他线程修改 UI 组件,这就是它没有在 UI 上获得更新的原因。相反,使用TaskScheduler.FromCurrentSynchronizationContext()which 将为您提供 UI 线程的调度程序并在 UI 线程上分派您的操作。

这将起作用 -

        Task.Factory.StartNew(() =>
        {
            return new CCDatabase().CCDB;
        }).ContinueWith(taskState =>
        {
            items = taskState.Result;
        }, TaskScheduler.FromCurrentSynchronizationContext());
于 2013-11-03T08:30:59.790 回答