WPF应用程序中的标签未更新

时间:2017-03-07 00:13:20

标签: wpf label

我有以下代码:

label1.content = "Start";
bool a = executeLongTask();
label1.content = "Done";

由于某种原因,标签仅在executeLongTask()方法完成后才更新为“完成”。它完全跳过显示“开始”消息。

为什么在应用程序运行时标签没有设置为“Start”,如何在不使用多个线程的情况下将其更新为“Start”?

顺便说一下,executeLongTask()方法调用PowerShell脚本并等待它输出,然后继续执行label1.content =“Done”;

2 个答案:

答案 0 :(得分:3)

  

由于某种原因,标签仅在executeLongTask()方法完成后才更新为“完成”。它完全跳过显示“开始”消息。

那是因为UI线程需要返回其主循环才能处理WM_PAINT更新。当您第一次设置标签时,WPF会记下它应该在返回到消息处理循环时重绘标签。然后UI在executeLongTask方法中保持忙碌,然后第二次设置标签,WPF再次记下它应该重绘标签。当您将控制返回到UI消息循环时,它最终有机会实际执行重绘并更新您在屏幕上看到的内容。

  

如何在不使用多个线程的情况下首先更新为“Start”?

最简单的解决方案 使用多个线程。例如:

label1.content = "Start";
bool a = await Task.Run(() => executeLongTask());
label1.content = "Done";

或者,您可以重写executeLongTask以异步操作,然后您不需要单独的线程:

label1.content = "Start";
bool a = await executeLongTaskAsync();
label1.content = "Done";

答案 1 :(得分:1)

文本只会在函数返回后更新。如果您希望在executeLongTask()运行时进行更新,则需要使用async/await模式。这将使您可以在长任务完成之前返回控制权。