【问题标题】:Wpf UI doesnt update if I use Thread.Sleep如果我使用 Thread.Sleep,Wpf UI 不会更新
【发布时间】:2014-04-13 20:28:36
【问题描述】:
private void Window_ContentRendered_1(object sender, EventArgs e)
        {
            StatusLabel.Text = "Doesnt show up until the sleep is over...0_0";
            System.Threading.Thread.Sleep(2000);
        }

我想问一下为什么会这样,然后才有解决方案。谢谢大家

【问题讨论】:

  • 不要阻塞 UI 线程。相反,请使用await Task.Delay()
  • 但是为什么..它在我写到 ui 之后发生了。需要先看到它,然后ui才会阻塞
  • 您仍然在事件处理程序中,只有当它返回时,调度程序才会调度新的事情来执行,例如 UI 更新等。
  • 您希望该消息显示在睡眠之前还是之后?

标签: wpf


【解决方案1】:

问题是你在 UI 线程上睡觉

在第一行执行后,您在 UI 线程上睡着了,但刷新 UI 是 UI 线程的责任(UI 线程在渲染调度程序优先级上刷新 UI)。因此,您在第一行执行后看不到任何更新,因为 UI 线程永远不会有时间执行在调度程序上排队的渲染优先项。

理想情况下,您应该使用DispatcherTimer 在 UI 线程上等待一定的时间间隔,然后在间隔时间过去后更新。


另外,您应该使用 backgroundWorker 在后台线程上移动长时间运行的任务,并在该线程上休眠,而不是在 UI 线程上。此外,正如 SLaks 建议的那样,您可以使用 async/await 来获得所需的结果。


然而,快速而肮脏的解决方案是在您睡觉之前在 UI 线程上调度空委托,并将 Dispatcher 优先级设置为 Render,以便在线程进入睡眠状态之前执行 UI 刷新部分.

StatusLabel.Text = "Doesnt show up until the sleep is over...0_0";
lbStatus.Dispatcher.Invoke((Action)(() => { }), DispatcherPriority.Render);
Thread.Sleep(2000);

这里的想法是,一旦您在具有渲染优先级的 UI 调度程序上排队空委托,它将执行优先级高于或等于渲染的所有待处理项目。由于 UI 刷新是在渲染优先级上完成的,因此 UI 将被刷新,您将在 GUI 上的标签内容中看到更新。

【讨论】:

    猜你喜欢
    • 2019-07-08
    • 2014-11-23
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多