C# 在子线程中创建段落以在主线程中创建FlowDocument
我正在创建一个线程来执行一些长期运行的过程,并构建一个段落,我将在RichTextBox中显示该段落 通常,这只需通过以下方式完成:C# 在子线程中创建段落以在主线程中创建FlowDocument,c#,wpf,multithreading,richtextbox,paragraph,C#,Wpf,Multithreading,Richtextbox,Paragraph,我正在创建一个线程来执行一些长期运行的过程,并构建一个段落,我将在RichTextBox中显示该段落 通常,这只需通过以下方式完成: Paragraph paragraph = new Paragraph(); paragraph.Inlines.Add(new TextBlock() { Text = "Hello i´m som text", TextWrapping = TextWrapping.NoWrap }); richtextbox.Document = n
Paragraph paragraph = new Paragraph();
paragraph.Inlines.Add(new TextBlock()
{
Text = "Hello i´m som text",
TextWrapping = TextWrapping.NoWrap
});
richtextbox.Document = new FlowDocument(paragraph);
很好
但我希望在一个线程中创建段落,然后添加到RichTextBox,如:
我的问题是,这将返回错误:
调用线程无法访问此对象,因为其他线程拥有它。在richtextbox.Document上=新的FlowDocument段落
我已经分享了这个问题的解决方案,作为对类似问题的回答, 请参阅及。
在性能和UI阻塞方面,if应该符合您的需要。如果您自2013年以来找到了解决问题的另一种方法,您也可以分享吗?很抱歉,但看不到连接……错误很明显,您试图通过一个不是当前UI线程的线程来更改UI元素的内容。所以你必须得到一个有访问权的线程,让它更新你的控件。如果我这样做,我的代码需要1分30秒来处理。。。。子线程的想法消失了,因为我几乎总是将数据处理到UI线程使用的段落。我认为子线程的想法是创建长时间进程并将结果返回到UI,但如果我错了,请纠正我。获取UI更新的唯一方法是获取处理UI的线程,因此从性能角度来看,没有其他选择。您可以始终使用不同的线程来完成所有工作,然后调用UI线程,这仍然是另一种情况。
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);
}
}