WPF、MVVM:如何处理重(慢)初始化

WPF、MVVM:如何处理重(慢)初始化,wpf,multithreading,mvvm,constructor,initialization,Wpf,Multithreading,Mvvm,Constructor,Initialization,在我的viewmodels中,我通常需要从数据库获取数据,或者检查一些端口和连接以访问一些硬件,这大约需要3-10秒 如果我将该初始化放在VM构造函数中,那么UI将冻结。我当然不想要那个。我可以生成一个新线程并在那里进行初始化,但这总是会带来实现和同步开销,因为我需要在许多VM中这样做。这样一个虚拟机驱动器看起来是这样的: public PrinterConfigurationVM() { ScanPrintersOnCOM(); // Scans COM ports and ident

在我的viewmodels中,我通常需要从数据库获取数据,或者检查一些端口和连接以访问一些硬件,这大约需要3-10秒

如果我将该初始化放在VM构造函数中,那么UI将冻结。我当然不想要那个。我可以生成一个新线程并在那里进行初始化,但这总是会带来实现和同步开销,因为我需要在许多VM中这样做。这样一个虚拟机驱动器看起来是这样的:

public PrinterConfigurationVM()
{
    ScanPrintersOnCOM(); // Scans COM ports and identifies if it is a printer, slow
    ScanPrintersOnUSB(); // Scans USB printers, fast
    FetchPrinterConfigurations(); // Access to db, not so slow
}
是否已经有了一个简单的解决方案(模式或一些库)?你有什么建议


系统:.NET 4.0、WPF、MVVM Light

为什么您的所有VM都可以访问一个类,该类在后台线程上扫描打印机一次,并包含一个方法,如果需要,可以调用该方法重新扫描?3-10秒并不可怕,您可以禁用UI,显示微调器,如果可以估计时间,还可以使用进度条,并启动一个线程来创建所有虚拟机。@Rachel,正如我提到的,对于许多资源,我需要在许多虚拟机中使用这种行为。我可以实现你的建议,但我想知道是否有更简单的方法。@Pragmateek,有很多资源需要花那么多时间来初始化。因此,如果你将这个数字乘以5,它会上升到一分钟,或者我需要在后台线程中并行初始化它们(带来了很多复杂性)。@Pragmateek我想我看不出这个代码示例有什么问题:)创建一个
ObservableCollection
,在单独的线程上搜索打印机,在主线程上用搜索结果填充集合,并将UI绑定到集合。当集合获取新项目时,它将自动更新UI,因为它触发了
CollectionChanged
事件,长时间运行的部分将在后台线程上执行,以避免锁定UI,并且可以在主线程上锁定和更新集合,这样线程就不会在试图同时更新集合时互相绊倒