【问题标题】:WPF MVVM Refresh ViewWPF MVVM 刷新视图
【发布时间】:2016-11-02 21:46:55
【问题描述】:

我有一个使用 MVVM 设计属性的 WPF 应用程序。填充网格需要一个长时间运行的过程,我想为其显示一个繁忙的光标。我有改变光标工作的部分。我遇到的问题是光标绑定到一个名为 IsBusy 的布尔值。当调用运行一段时间的方法时,我将 IsBusy 设置为 true,当方法完成时,我将其设置回 false。

public void LongProcedure(){ IsBusy=true; ... long running code here IsBusy=false; }`

我知道与 IsBusy 绑定的游标正在工作,因为我用另一个过程对其进行了测试

IsBusy=!IsBusy;

这确实会切换光标。我遇到的问题是在方法中的代码运行时视图似乎没有刷新。将 IsBusy 设置为 true 后,有没有办法强制刷新视图?

【问题讨论】:

  • 您是否在同一个线程上执行长时间运行的任务?
  • 是的,我希望保持简单。该过程需要 5-10 秒,并且在运行时他们不能做任何其他事情。我想显示等待光标只是为了让用户知道发生了什么事。
  • @Pedler 不幸的是,更新屏幕需要相同的线程。由于它运行其他东西,它不能用于更新屏幕。
  • 亲爱的主,请告诉我如何在 UI 线程中工作时不阻塞 UI 线程的典型欺骗目标,赞美你的名字。阿门。 ……等等,说不定会是这样呢?我认为是这样。准备好接受过多的投票吧,Pedler!

标签: wpf mvvm


【解决方案1】:

在每个窗口应用程序中,都有一个线程专门用于处理应用程序的可视化表示。这个线程是the UI thread。当您的代码响应窗口事件(例如,Loaded 事件或用户单击按钮)运行时,它正在此 UI 线程上运行。当您的代码运行时,UI 线程正在执行您的工作,并且无法更新窗口的可视化表示。在极端情况下(即,您的工作需要相当长的时间才能完成),您的窗口将显示为锁定状态。

如果您正在使用 UI 线程执行长时间运行的工作,那么您做得不对。您应该使用 async-await 或使用 Task.Run() 以便在后台线程上执行您的工作

如果LongProcedure() 是 IO-bound(比如等待来自某个地方的数据),那么您应该使用 async-await。如果它是 CPU 密集型的(大量数据处理/计算),那么您应该使用Task.Run()

异步等待:

public async Task LongProcedure()
{
    IsBusy = true;

    await GetDataFromSomewhereAsync();

    IsBusy = false;
}

public async void CallingMethod()
{
    ......
    await LongProcedure();
}

任务.运行:

public void LongProcedure()
{
    IsBusy = true;
    ... // long running code here
    IsBusy = false;
}
public async void CallingMethod()
{
    ......
    await Task.Run((Action) LongProcedure);
}

请注意,无法直接从后台线程更新 UI。通常,您需要首先将更新代码编组到 UI 线程上。有许多不同的方法可以做到这一点,这取决于您使用的是哪种 Windows 应用程序,例如windows formsWPF 等。

【讨论】:

  • 感谢您的帮助。这为我指明了正确的方向。我最终使用了 BackgroundWorker 类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 2011-06-19
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
相关资源
最近更新 更多