c# - 在 MVVM 中阻塞 UI 线程

标签 c# wpf multithreading mvvm

我有一个关于 MVVM 实践的基本问题,不建议在绑定(bind)到 UI 控件的 View 模型属性的 setter 中调用模型。

public int Woo
{
   get
    {
       return _Woo;
    }
    set
    {
      _Woo=model.SetWoo(value);
       NotifyPropertyChange("Woo");
    }
}

相反,人们建议在模型中设置属性并向 viewmodel 发送事件以使用新值刷新其属性并最终刷新 UI 控件。因为如果模型的方法花费大量时间,上述代码将阻止 UI 控件。

我的问题是,即使我从模型发送事件,UI 线程仍然被阻塞,直到其订阅的委托(delegate)执行完成。那么这两种方法有什么区别,哪一种是正确的?

最佳答案

为了不阻塞 UI 线程,我一直使用上述方法。

public int Woo
{
    get
    {
       _Woo;
    }
    set
    {
       BackgroundWorker backgroundWorker = new BackgroundWorker();
       //DoWork is ran on separate thread and does not block UI
       backgroundWorker.DoWork += (sender, arguments) =>
       {
           arguments.Result = model.GetWoo(); //Store data in worker result
       }
       //This method runs definitely on UI
       backgroundWorker.RunWorkerCompleted += (sender, arguments) =>
       {
           //Get stored result and assign to UI-bound stuff
           _Woo = arguments.Result; 
           NotifyPropertyChange("Woo");
       }      
       backgroundWorker.RunWorkerAsync(); 
   }
}

关于c# - 在 MVVM 中阻塞 UI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20833759/

相关文章:

c# - WPF:选择 Canvas 中的子控件

c# - 谁能发现我的 Damerau-Levenshtein Distance 实现中的错误吗?

javascript - 从 Javascript 中的循环调用的缓慢 C# 进程正在锁定我的应用程序,直到它完成

c# - 如何以编程方式重新启动 Netgear 调制解调器?

wpf - 使用依赖项属性在 ControlTemplate 触发器中设置值

java - 如何杀死java Invocable

c# - 基于点击事件调用代码隐藏方法

c# - ListCollectionView分组已分组的项目

java - 在 servlet 过滤器中同步代码

java - 在java中的一个可运行线程中调用不同的方法