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);
}
我想问为什么它会出现问题而且只有解决方案。谢谢所有
答案 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上看到标签内容的更新。