WPF:调用线程无法访问此对象,因为另一个线程拥有它

时间:2017-03-21 08:57:15

标签: wpf async-await

我正在学习c#和wpf。 我试图从网上加载一个img并将其绑定到一个图像,但失败了。

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

但是我已经使用了“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;
     });
}

1 个答案:

答案 0 :(得分:2)

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