0

我在 VisualStudio 中完成了一个 GUI,并使用一个 TextBox 向用户显示正在发生的事情。

myTextBox.AppendText用来显示信息,例如

myTextBox.AppendText("\n" + DateTime.Now.ToLocalTime() + ": " + serviceName + " waiting for stopping");
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped);
service.Close();
myTextBox.AppendText("\n" + DateTime.Now.ToLocalTime() + ": " + serviceName + " has been stopped correcly");

等等。无论如何,只有在所有作业完成后,文本框才会填充文本。因此,当我的所有代码都运行完毕后,TextBox 将充满所有字符串。所以,我想在调用时打印字符串AppendText。我错过了什么吗?也许有什么像java中的线程冻结?

提前谢谢你。

4

3 回答 3

1

您的问题是您的服务调用(显然)在 UI 线程上运行,因此在它们停止阻塞线程之前不会显示任何内容。

您需要将服务调用放在后台线程上,然后通过调度程序将更改编组到 UI 线程来更改文本框文本

于 2016-05-10T12:53:51.067 回答
0

这就是我用的

public static class ExtensionMethods
{
   private static Action EmptyDelegate = delegate() { };

   public static void Refresh(this UIElement uiElement)
   {
      uiElement.Dispatcher.Invoke(DispatcherPriority.Render, EmptyDelegate);
   }
}
private void LoopingMethod()
{
   for (int i = 0; i < 10; i++)
   {
      label1.Content = i.ToString();
      label1.Refresh();
      Thread.Sleep(500);
   }
}

通常 UI 不会刷新,直到后面的代码完成
您需要强制刷新

于 2016-05-10T15:22:02.393 回答
0

因此,当我的所有代码都运行完毕后,TextBox 将充满所有字符串。所以,我想在调用 AppendText 时打印字符串

如果我正确理解了该语句,您希望每次都替换文本,而不是在其中添加一些文本。如果是这种情况,您应该使用该属性而不是TextBoxTextBox.TextAppendText

TextBox.Text

设置此属性会将文本框的内容替换为指定的字符串。

AppendText

使用此方法文本添加到现有文本

于 2016-05-10T12:57:17.367 回答