【问题标题】:Create paragraph in subthread to FlowDocument in main thread在子线程中创建段落到主线程中的 FlowDocument
【发布时间】: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


【解决方案1】:

我已经分享了这个问题的解决方案作为类似问题的答案, 请参考SO answermy blog post。 在性能和缺乏 UI 阻塞方面是否应该满足您的需求。如果您在 2013 年之后找到了另一种解决问题的方法,您也可以分享一下吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    相关资源
    最近更新 更多