【发布时间】:2019-01-06 02:38:38
【问题描述】:
当我在单独的线程中运行 FlowDoc 时出现异常,即使使用调度程序调用也无法解决问题。 我读了一些关于将flowdoc序列化为xdoc并序列化回来的文章,但这听起来很麻烦。 我已经被这个问题困扰了2天,我的头裂了,请帮忙:)
这是我的代码
new Thread(() =>
{
Thread.CurrentThread.IsBackground = true;
for (int i = 0; i < 10; i++)
{
mcFlowDoc = new FlowDocument();
// Create a paragraph with text
Paragraph para = new Paragraph();
para.Inlines.Add(new Bold(new Run("This is a Title \n")));
para.Inlines.Add(new Run("I am a flow document. Would you like to edit me? \n"));
Dispatcher.CurrentDispatcher.Invoke((Action)(() =>
{
mcFlowDoc.Blocks.Add(para);
}));
}
}).Start();
还有我的 XAML,我只是使用普通的 RichTextBox 并将 flowdoc 绑定到 Document 属性:
<fsrtb:FsRichTextBox x:Name="EditBox" Document="{Binding mcFlowDoc}" Grid.Row="0" Margin="10,10,10,91" ToolbarBackground="#FFD2CB84" ToolbarBorderBrush="#FFC6BE75" ToolbarBorderThickness="1,1,1,0" CodeControlsVisibility="Collapsed" />
谢谢。
【问题讨论】:
-
所有文档元素(如 FlowDocument 或 Paragraph)都派生自 DispatcherObject,因此具有线程关联性。不能在创建它们的线程之外访问它们。换句话说,所有这些元素都必须在 UI 线程中创建和修改,即 RichTextBox 的创建位置。
-
你得到的确切异常是什么?
-
还要注意
Dispatcher.CurrentDispatcher为你的线程创建了一个新的Dispatcher,它不是你应用的UI线程的Dispatcher。但是,即使使用Application.Current.Dispatcher,您的代码也无法运行。 -
@Clemens 谢谢你的回复,我知道,这就是我来这里找工作的原因:)
-
没有。不要在后台线程中创建文档元素。如果创建文档内容有耗时操作,使用 async/await,但在 UI 线程中创建文档元素。
标签: c# wpf multithreading mvvm richtextbox