我有以下代码:
label1.content = "Start";
bool a = executeLongTask();
label1.content = "Done";
由于某种原因,标签仅在executeLongTask()方法完成后才更新为“完成”。它完全跳过显示“开始”消息。
为什么在应用程序运行时标签没有设置为“Start”,如何在不使用多个线程的情况下将其更新为“Start”?
顺便说一下,executeLongTask()方法调用PowerShell脚本并等待它输出,然后继续执行label1.content =“Done”;
答案 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模式。这将使您可以在长任务完成之前返回控制权。