我最近將我的應用程序從WinForms轉換爲WPF,並且我對大部分新功能感到滿意。但是,我遇到了一個主要的絆腳石。當我將文本不斷添加到我的文本框中時,UI線程變得如此受阻,以至於我無法做任何事情,只能看它追加文本!我需要能夠切換選項卡在我的選項卡控制,單擊按鈕等等。奇怪的是,我絕對沒有在WinForms的UI線程放緩!因此,這裏是我的應用程序的一個小背景:它作爲「動作隊列」的一部分運行其他進程,並將這些進程的stdout和stderr分配到兩個單獨的文本框中,以及日誌文本框(這些是受影響的文本框)。在低輸出的過程中,沒有減速,但是當我使用像SVN checkout和文件複製這樣的進程時,我立即得到如此多的文本輸出,它所能做的就是追加文本。WPF附加文本塊UI線程嚴重,但WinForms不?
這裏是我的打印代碼:
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在調用時比較慢,而且我被搞砸了。我花了很多工作將這個應用程序從WinForms切換到WPF,所以如果有人知道我爲什麼會在打印速度上出現如此巨大的放緩,請讓我知道!
編輯:
我還要補充一點,我使用的是RichTextBox
,而不是一個TextBox
,和我需要的RichTextBox
的大膽某些文本的功能。如果有一種方法可以提供粗體TextBox類的粗體文本,請讓我知道。
您是否嘗試過使用WPF性能套件http://msdn.microsoft.com/en-us/library/aa969767.aspx – 3dd
也可能重複http://stackoverflow.com/questions/2465181/ is-this-slow-wpf-textblock-performance-expected – 3dd
@ 3dd我在第二個鏈接上閱讀,這很有幫助。但是,對我來說,在進程輸出中獲得實時更新而不影響UI線程(這可以通過WinForms進行)是非常重要的。鏈接的答案和我的後續測試讓我相信WPF在這方面比WinForms慢很多,這非常不幸。我可能不得不考慮製作一個性能文本框類... – Darkhydro