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 にテキストが入力されます。したがって、すべてのコードの実行が完了すると、TextBox はすべての文字列で満たされます。ということで、呼び出した時点で文字列を出力したいと思いますAppendText。何か不足していますか?たぶん、Javaのようにスレッドフリーズするものはありますか?

よろしくお願いします。

4

3 に答える 3

1

あなたの問題は、サービス呼び出しが (明らかに) UI スレッドで実行されているため、スレッドのブロックが停止するまで何も表示されないことです。

サービス呼び出しをバックグラウンド スレッドに配置し、ディスパッチャーを介して変更を UI スレッドにマーシャリングして、テキスト ボックスのテキストを変更する必要があります。

于 2016-05-10T12:53:51.067 に答える
0

したがって、すべてのコードの実行が完了すると、TextBox はすべての文字列で満たされます。したがって、AppendText を呼び出すときに文字列を出力したいと思います。

私がそのステートメントを正しく理解していれば、テキストを追加するのではなく、毎回テキストを置き換える必要があります。その場合は、代わりにプロパティを使用する必要がありますTextBoxTextBox.TextAppendText

TextBox.Text

このプロパティを設定すると、テキスト ボックスの内容が指定された文字列に置き換えられます。

AppendText

このメソッドを使用して、既存のテキストにテキストを追加します

于 2016-05-10T12:57:17.367 に答える
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 に答える