我可以从工作线程初始化ViewModel吗?

时间:2014-02-25 10:10:19

标签: wpf multithreading mvvm

我正在设计遵循MVVM模式的WPF应用程序。但是当谈到多线程问题时,我发现我的知识非常有限。我的问题与标题完全一样:我可以在工作线程中创建ViewModel个对象吗?

目前我们没有使用任何依赖注入,所以我只是在UI线程中的View的构造函数中创建ViewModel对象(我想这不是最佳实践)。但是现在有一个问题:我们有一个核心类,我们称之为CoreContext,来自负责许多核心任务的遗留软件,我们的软件和数据库之间的数据访问层就是其中之一。我们的许多ViewModel都将CoreContext的一个引用作为数据成员。不幸的是,这个类不是构建线程安全的。当我在UI线程中创建ViewModel实例(以及因此CoreContext实例)时,保证仅在拥有线程中访问CoreContext。但是,当涉及一些繁重的数据库查询时,UI变得无法响应。

所以现在我想知道,是否可以在非UI线程中实例化ViewModel(因此CoreContext实例),以便UI可以在VM(最终是{{ 1}})正在进行大量查询?

1 个答案:

答案 0 :(得分:1)

我不认为在非UI线程上创建和更新ViewModel是个好主意。但是,如果你真的需要,没有什么能阻止你这样做。您只需要使整个ViewModel线程安全,即在访问数据字段的任何地方使用正确的锁,包括属性getter / setter。应该对整个ViewModel对象层次结构进行。

WPF框架将自动封送数据绑定UI控件的INotifyPropertyChanged.PropertyChanged通知(至少在.NET 4.5,AFAIK中)。这样,控件将在主UI线程上自动更新,如预期的那样。

重要的是:如果设置或获取任何ViewModel属性会启动涉及旧数据访问层的后台操作,则必须在最初创建数据访问层的同一线程上执行此类操作。也就是说,为它实现线程关联。