我正在使用第三方richtextbox控件,但我对'.xaml'文件的异步加载不太满意,所以我尝试了这个
async void LoadAsync(string str)
{
FileStream stream = File.OpenRead(str);
DocumentAdv? doc = await Task.Run(() => { return XamlReader.Load(stream) as DocumentAdv; });
RTB.Document.Dispatcher.Invoke(() =>
{
RTB.Document = doc;
});
}
但是我得到了一个例外——“调用线程无法访问这个对象,因为另一个线程拥有它。”
我想做的是,因为我不想调用它的接口,所以我想异步加载文档,然后将其分配给我的richtextbox控件。
为什么会发生这种情况以及如何解决?谢谢!
我不熟悉您正在使用的库,但根本问题是文档对象是在后台线程中作为
XamlReader.Load(stream)
的一部分构建的,但随后通过以下方式分配给 UI 线程上的 RTB.Document
调度员。
如果 XAML 数据量确实相当大,并且您注意到从磁盘读取期间存在延迟,您可以做的一件事是首先使用
MemoryStream
将流从磁盘异步读取到 Stream.ReadAsync
,然后通过内存流到 XamlReader.Load
。
但是在任何情况下您都不需要(或能够)将其任何部分包裹在
Task.Run
中。当您尝试将所做的操作应用到 UI 时,这几乎总是会导致线程错误。