我正在设计遵循MVVM模式的WPF应用程序。但是当谈到多线程问题时,我发现我的知识非常有限。我的问题与标题完全一样:我可以在工作线程中创建ViewModel
个对象吗?
目前我们没有使用任何依赖注入,所以我只是在UI线程中的View
的构造函数中创建ViewModel对象(我想这不是最佳实践)。但是现在有一个问题:我们有一个核心类,我们称之为CoreContext
,来自负责许多核心任务的遗留软件,我们的软件和数据库之间的数据访问层就是其中之一。我们的许多ViewModel
都将CoreContext
的一个引用作为数据成员。不幸的是,这个类不是构建线程安全的。当我在UI线程中创建ViewModel
实例(以及因此CoreContext
实例)时,保证仅在拥有线程中访问CoreContext
。但是,当涉及一些繁重的数据库查询时,UI变得无法响应。
所以现在我想知道,是否可以在非UI线程中实例化ViewModel
(因此CoreContext
实例),以便UI可以在VM(最终是{{ 1}})正在进行大量查询?
答案 0 :(得分:1)
我不认为在非UI线程上创建和更新ViewModel是个好主意。但是,如果你真的需要,没有什么能阻止你这样做。您只需要使整个ViewModel
线程安全,即在访问数据字段的任何地方使用正确的锁,包括属性getter / setter。应该对整个ViewModel
对象层次结构进行。
WPF框架将自动封送数据绑定UI控件的INotifyPropertyChanged.PropertyChanged
通知(至少在.NET 4.5,AFAIK中)。这样,控件将在主UI线程上自动更新,如预期的那样。
重要的是:如果设置或获取任何ViewModel属性会启动涉及旧数据访问层的后台操作,则必须在最初创建数据访问层的同一线程上执行此类操作。也就是说,为它实现线程关联。