我有一个关于 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/