我最近将我的应用程序从WinForms转换到WPF,并且我对大多数新功能感到满意。然而,我遇到了一个主要的障碍。当我不断将文本附加到我的文本框中时,UI线程会被阻塞得如此厉害,以至于我除了观看它附加文本之外什么都做不了!我需要能够在我的选项卡控件中切换选项卡、单击按钮等等。奇怪的是,在WinForms中,我绝对没有UI线程的减速!
因此,这里是关于我的应用程序的一些背景:它作为“操作队列”的一部分运行其他进程,并将这些进程的标准输出和标准错误输出到两个独立的文本框以及日志文本框中(这些是受影响的文本框)。在低输出进程上,没有减速,但是当我使用诸如SVN检出和文件复制之类的进程时,我会一次获得很多文本输出,所有它能做的就是附加文本。
以下是我的打印代码:
我的担忧是WPF在某些方面的Invokes速度较慢,我很困扰。我花了很多时间将这个应用程序从WinForms转换到WPF,所以如果有人知道为什么打印速度会如此缓慢,请告诉我!
编辑:
我还应该补充一点,我正在使用RichTextBox而不是TextBox,并且需要RichTextBox的功能来加粗某些文本。如果有一种更不繁琐的TextBox类可以提供粗体文本,请告诉我。
因此,这里是关于我的应用程序的一些背景:它作为“操作队列”的一部分运行其他进程,并将这些进程的标准输出和标准错误输出到两个独立的文本框以及日志文本框中(这些是受影响的文本框)。在低输出进程上,没有减速,但是当我使用诸如SVN检出和文件复制之类的进程时,我会一次获得很多文本输出,所有它能做的就是附加文本。
以下是我的打印代码:
public void PrintOutput(String s)
{
String text = s + Environment.NewLine;
Window.Dispatcher.Invoke(new StringArgDelegate(Window.PrintOutput), text);
Debug.Log("d " + text);
}
public void PrintLog(String s)
{
ClearLogButtonEnabled = true;
String text = s + Environment.NewLine;
Window.Dispatcher.Invoke(new StringArgDelegate(Window.PrintLog), text);
}
以及相应的代码后端:
public void PrintOutput(String s)
{
outputTextBox.AppendText(s);
outputTextBox.ScrollToEnd();
if (!clearOutputButton.IsEnabled) clearOutputButton.IsEnabled = true;
}
public void PrintLog(String s)
{
logTextBox.AppendText(s);
logTextBox.ScrollToEnd();
}
为了避免被指责我也在UI线程上工作,这里是启动独立的工作线程的代码:
Thread actionThread = new Thread(new ThreadStart(ActionManager.Instance().ExecuteActions));
actionThread.Name = "Action Manager Work Thread";
actionThread.Start();
这是处理启动、运行和清理所有辅助进程的线程。这些进程使用上面显示的打印方法来打印它们的stdout/stderr输出。此外,每个进程都有自己的线程!
Thread procThread = new Thread(new ThreadStart(StartProcess));
procThread.Name = action.Name + "_" + Guid.NewGuid();
procThread.Start();
我的担忧是WPF在某些方面的Invokes速度较慢,我很困扰。我花了很多时间将这个应用程序从WinForms转换到WPF,所以如果有人知道为什么打印速度会如此缓慢,请告诉我!
编辑:
我还应该补充一点,我正在使用RichTextBox而不是TextBox,并且需要RichTextBox的功能来加粗某些文本。如果有一种更不繁琐的TextBox类可以提供粗体文本,请告诉我。