如果我使用Thread.Sleep,Wpf UI不会更新

时间:2014-04-13 20:28:37

标签: wpf

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);
        }

我想问为什么它会出现问题而且只有解决方案。谢谢所有

1 个答案:

答案 0 :(得分:3)

问题是你在UI线程上睡觉

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

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


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


然而,快速而肮脏的解决方案是在您调用它之前将Dispatcher优先级设置为Render 的UI线程上调度空委托,以便在线程处于睡眠状态之前执行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上看到标签内容的更新。