【发布时间】:2013-06-10 22:12:15
【问题描述】:
我正在创建一个 Thread 来执行一些长期流程并构建一个我将在 RichTextBox 中显示的段落。
通常这只是由以下人员完成:
Paragraph paragraph = new Paragraph();
paragraph.Inlines.Add(new TextBlock()
{
Text = "Hello i´m som text",
TextWrapping = TextWrapping.NoWrap
});
richtextbox.Document = new FlowDocument(paragraph);
(工作正常)
但我希望在线程中创建段落,然后将其添加到 RichTextBox 中,例如:
Thread t = new Thread(new ThreadStart(CreateText));
t.Start();
private void CreateText()
{
Paragraph paragraph = new Paragraph();
paragraph.Inlines.Add(new TextBlock()
{
Text = "Hello i´m som text",
TextWrapping = TextWrapping.NoWrap
});
Main.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() =>
{
richtextbox.Document = new FlowDocument(paragraph);
}
}
我的问题是这会返回错误:
调用线程无法访问此对象,因为另一个线程拥有它。关于richtextbox.Document = new FlowDocument(paragraph);
【问题讨论】:
-
对不起,看不到连接....
-
错误行非常明显,您正试图通过不是当前 UI 线程的线程更改 UI 元素的内容。因此,您必须获取有权访问的线程,让该线程更新您的控件。
-
如果我这样做,我的代码是否需要 1 分 30 秒来处理......并且子线程的想法已经消失,因为我几乎总是将数据处理到段落曾经是 UI 线程。我认为子线程的想法是创建长时间进程并将结果返回到 UI,但如果我错了,请纠正我。
-
获取 UI 更新的唯一方法是获取处理 UI 的线程,因此在性能方面,没有其他选择。您始终可以使用不同的线程来完成所有工作,然后调用 UI 线程,这仍然是不同的情况。
标签: c# wpf multithreading richtextbox paragraph