C# 在子线程中创建段落以在主线程中创建FlowDocument

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

我正在创建一个线程来执行一些长期运行的过程,并构建一个段落,我将在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,如:

我的问题是,这将返回错误:

调用线程无法访问此对象,因为其他线程拥有它。在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);
    }
}