gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:28:29 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

关于wpf - 我可以从工作线程初始化 ViewModel 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22010864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com