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

Joh*_*ohn 0 wpf label

我有以下代码:

label1.content = "Start";
bool a = executeLongTask();
label1.content = "Done";
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ste*_*ary 5

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

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

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

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

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

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

label1.content = "Start";
bool a = await executeLongTaskAsync();
label1.content = "Done";
Run Code Online (Sandbox Code Playgroud)