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