如何在WPF中异步访问控件?

问题描述 投票:0回答:1

我正在使用第三方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控件。

为什么会发生这种情况以及如何解决?谢谢!

c# wpf
1个回答
0
投票

我不熟悉您正在使用的库,但根本问题是文档对象是在后台线程中作为

XamlReader.Load(stream)
的一部分构建的,但随后通过以下方式分配给 UI 线程上的
RTB.Document
调度员。

如果 XAML 数据量确实相当大,并且您注意到从磁盘读取期间存在延迟,您可以做的一件事是首先使用

MemoryStream
将流从磁盘异步读取到
Stream.ReadAsync
,然后通过内存流到
XamlReader.Load

但是在任何情况下您都不需要(或能够)将其任何部分包裹在

Task.Run
中。当您尝试将所做的操作应用到 UI 时,这几乎总是会导致线程错误。

© www.soinside.com 2019 - 2024. All rights reserved.