在UI线程外部创建的绑定TextBlock内联

时间:2017-07-07 16:18:57

标签: c# wpf multithreading mvvm textblock

我已经创建了一个依赖项属性,允许TextBlock绑定到Inlines,这可以正常工作。

因为我的内联创建非常繁重,所以我希望在与UI线程分开的一个线程中执行此操作,以便在加载此特定内容时UI不会挂起。但是,当我在一个单独的帖子中创建内联时,我得到了InvalidOperationException

  

调用线程无法访问此对象,因为另一个线程拥有它。

然后我对依赖项属性进行了一些更改,以便在不同线程拥有的对象上使用Dispatcher.Invoke。但是,我得到TaskCanceledException

  

任务被取消了。

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

在这个问题(MVVM和所有)中发布一个最小,完整且可验证的示例有点大,但this file是一个完整的Visual Studio解决方案,它将抛出第一个异常。

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

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);
        }
    }
}

更改Inlines.AddRange()行以使用内联调度程序,会导致TaskCancelledException

foreach (Inline inline in inlines) {
    // TaskCanceledException is thrown here
    inline.Dispatcher.Invoke(() => {
        textBlock.Inlines.Add(inline);
    });
}

0 个答案:

没有答案