WPF:调用线程无法访问此对象,因为不同的线程拥有它

标签 wpf async-await

我正在学习 c# 和 wpf。 我尝试从网络加载 img 并将其绑定(bind)到图像,但失败了。

它说“调用线程无法访问该对象,因为另一个线程拥有它”

但是我已经使用了“Img1.Dispatcher.Invoke()”,为什么又出现这个异常?

private void Window_ContentRendered(object sender, EventArgs e)
{
    Img1.Dispatcher.Invoke(async () =>
    {
         Img1.Source = await DownloadImg("http address");
    });
}

private Task<ImageSource> DownloadImg(string url)
{
     return Task.Run(() =>
     {
         ImageSource source = new BitmapImage(new Uri(url));
         return source;
     });
}

最佳答案

您无法访问图像,因为您必须在 UI 线程中执行此操作。您可以创建一个私有(private)字段,并在构造函数中使用 _dispatcher = Dispatcher.CurrentDispatcher 进行设置。在您的 Task 中,您必须使用此调度程序并调用方法 Invoke 来设置您的图像。 更多信息:Dispatcher.CurrentDispatcher

关于WPF:调用线程无法访问此对象,因为不同的线程拥有它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42922338/

相关文章:

c# - 如果属性值没有变化,是否可以从 IValueConverter 进行 "cancel"依赖属性赋值?

c# - 实现键盘快捷键

c# - 使用异步数据读取器

Javascript - 处理异步竞争条件

c# - 如何断言 C# 异步方法在单元测试中引发异常?

postgresql - 如何将 tokio_postgres 与 Warp 结合使用?

javascript - 另一个 map 调用中的异步 Array.map()

c# - 将 UI 从 CLI 更改为 WPF

wpf - 确保按钮在 ScrollViewer 中获得焦点

wpf - 将两个 UIElements 作为 CommandParameter 传递