我最近将我的应用程序从WinForms转换为WPF,我对大多数新功能感到满意.然而,我遇到了一个重要的绊脚石.当我不断地将文本附加到我的文本框时,UI线程变得如此封闭,以至于我无法做任何事情,只是看它附加文本!我需要能够在我的选项卡控件,单击按钮等等中切换选项卡.奇怪的是,我在WinForms的UI线程中绝对没有减速!
所以,这里有一个关于我的应用程序的背景:它将其他进程作为"动作队列"的一部分运行,并将这些进程的stdout和stderr吐出到两个单独的文本框中,以及日志文本框(这些是受影响的文本框).在低输出进程中,没有减速,但是当我使用SVN checkout和文件复制等进程时,我会立即获得大量文本输出,它只能附加文本.
这是我的打印代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
和匹配的代码隐藏:
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();
}
Run Code Online (Sandbox Code Playgroud)
这样我就没有得到一堆指责说我正在UI线程上做我的工作,这是我启动单独的工作线程的代码:
Thread actionThread = new Thread(new ThreadStart(ActionManager.Instance().ExecuteActions));
actionThread.Name = "Action Manager Work Thread";
actionThread.Start();
Run Code Online (Sandbox Code Playgroud)
这是处理所有辅助进程的启动,运行和清理的线程.这些进程使用上面显示的打印方法来打印它们的stdout/stderr输出.此外,每个进程都有自己的线程! …