相关疑难解决方法(0)

WPF附加文本阻止UI线程,但WinForms没有?

我最近将我的应用程序从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输出.此外,每个进程都有自己的线程! …

c# wpf multithreading

5
推荐指数
1
解决办法
1213
查看次数

标签 统计

c# ×1

multithreading ×1

wpf ×1