【问题标题】:WPF Update view in loop循环中的 WPF 更新视图
【发布时间】:2017-04-02 11:29:11
【问题描述】:

我正在使用 MVVM,当模型为某个位置计算新背景时,它会告诉视图模型它已更改。所以我想做的是在每个新背景下更新视图,但我认为 Thread.Sleep 会阻塞主 UI 线程。

private void New_Background(object sender, BackgroundEventArgs e)
    {
        Application.Current.Dispatcher.InvokeAsync(new Action(() =>
        {
            Fields[e.Position].Background = e.Background; //update this position's background at every step
            OnPropertyChanged("Background");
            Thread.Sleep(50);
        }));
    }

有什么方法可以实现吗? 顺便说一句,如果我使用 MessageBox.Show(...) 而不是 Thread.Sleep,它会更新每个消息框的视图。

【问题讨论】:

  • "...它告诉 viewmodel 它已经改变了" 你不认为你的 viewmodel 也可以反过来通知视图它已经改变,从而消除了需要用于事件驱动的更新或计时器驱动的循环?
  • 这就是为什么会有“OnPropertyChanged("Background");"行,因此与视图的绑定有效。更新确实有效,但使用 Thread.Sleep,我想我阻塞了 UI 线程,所以它不会更新。我正在寻找另一种方法。

标签: c# wpf multithreading mvvm


【解决方案1】:

...但我认为 Thread.Sleep 会阻塞主 UI 线程。

是的,确实如此。您传递给 Application.Current.Dispatcher.InvokeAsync 方法的委托正在 UI 线程上执行。

我怎样才能延迟它,让它变慢一点?

放慢循环速度:

private async void New_Background(object sender, BackgroundEventArgs e)
{
    await Task.Delay(1000);
    Application.Current.Dispatcher.Invoke(new Action(async () =>
    {
        Fields[e.Position].Background = e.Background; //update this position's background at every step
        OnPropertyChanged("Background");
    }));
}

【讨论】:

    【解决方案2】:

    设置更高的priority

    Application.Current.Dispatcher.BeginInvoke(
    DispatcherPriority.Send, 
    new Action(() =>
            {
                Fields[e.Position].Background = e.Background; //update this position's background at every step
                OnPropertyChanged("Background");
            }));
    

    【讨论】:

    • 模型使用的算法总是计算下一步。下一步总是有一个新的背景图片。因此,在每一个新步骤中,我都想更新视图,以便它显示图片的实际位置,而不是算法开始之前的位置。基本上我想在循环中更新视图。
    • @KollingMaster:设置更高的优先级并查看...查看更新后的答案。
    • 这行得通,谢谢。现在,我怎样才能延迟它,让它变慢一点?
    • 等待Task.Delay(50);
    • 使动作异步然后使用 await Task.Delay 并没有延迟它。
    猜你喜欢
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2012-06-14
    相关资源
    最近更新 更多