C# 在UI线程外部创建的绑定文本块内联线

C# 在UI线程外部创建的绑定文本块内联线,c#,wpf,multithreading,mvvm,textblock,C#,Wpf,Multithreading,Mvvm,Textblock,我创建了一个dependency属性,允许文本块绑定到内联线,这很好 因为我的内联线创建非常繁重,所以我希望在一个与UI线程分离的线程中进行创建,以便在加载此特定内容时UI不会挂起。然而,当我在一个单独的线程中创建内联线时,我得到了一个invalidoOperationException 调用线程无法访问此对象,因为其他线程拥有它 然后,我对dependency属性做了一些更改,以便对其他线程拥有的对象使用Dispatcher.Invoke。但是,我随后得到一个TaskCanceledExcep

我创建了一个dependency属性,允许
文本块
绑定到
内联线
,这很好

因为我的内联线创建非常繁重,所以我希望在一个与UI线程分离的线程中进行创建,以便在加载此特定内容时UI不会挂起。然而,当我在一个单独的线程中创建内联线时,我得到了一个
invalidoOperationException

调用线程无法访问此对象,因为其他线程拥有它

然后,我对dependency属性做了一些更改,以便对其他线程拥有的对象使用Dispatcher.Invoke。但是,我随后得到一个
TaskCanceledException

一项任务被取消

那么,当内联线由单独的线程创建时,如何在
TextBlock
中使用内联线呢

在这个问题中,一个最小的、完整的和可验证的示例(MVVM和所有)有点大,但它是一个完整的VisualStudio解决方案,将引发第一个异常

两个引用的异常都发生在依赖项属性(TextblockInlineBinding.cs)中,这是从该文件更改的
属性:

private static void OnInlinesPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) {
    var textBlock = obj as TextBlock;
    if (textBlock != null)
    {
        textBlock.Inlines.Clear();
        List<Inline> inlines = e.NewValue as List<Inline>;

        if (inlines != null) {
            // InvalidOperationException is thrown here
            textBlock.Inlines.AddRange(inlines);
        }
    }
}

你能在引发异常的地方发布代码吗?第二个问题。@NtFreX问题现在更新了更多的代码和描述。内联线不可自由释放,因此您不能在UI线程之外的其他线程中创建它们。你的方法行不通。@Clemens如果它们只能在UI线程中创建,那么如何解决包含许多内联线的文本块的问题,包括许多在线获取的图像。。。这将非常缓慢,并将导致UI挂起,并且不会非常友好。想象一下,加载一个PDF,让阅读器在绘制所有内容时挂起1分钟。当然有更好的办法吗?不知道,抱歉。我不认为像PDF查看器或web浏览器这样的组件会使用带有内联线的文本块。
foreach (Inline inline in inlines) {
    // TaskCanceledException is thrown here
    inline.Dispatcher.Invoke(() => {
        textBlock.Inlines.Add(inline);
    });
}