我已经创建了一个依赖项属性,允许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);
});
}