1

我试图使用异步调用像这样从Internet下载图像:Windows Phone的C#,UnauthorizedAccessException创建的BitmapImage

private void DoGetAlbumart(object sender, DoWorkEventArgs e) 
    { 
     string req = (string)e.Argument; 
     WebClient wc = new WebClient(); 
     wc.OpenReadCompleted += new OpenReadCompletedEventHandler(ReadWebRequestCallback); 
     wc.OpenReadAsync(new Uri(req)); 

    } 

    void ReadWebRequestCallback(object sender, OpenReadCompletedEventArgs e) 
    { 
     if (e.Error == null && !e.Cancelled) 
     { 
      try 
      { 
       BitmapImage image = new BitmapImage(); 
       image.SetSource(e.Result); 
       SecondTile.Source = image; 
      } 
      catch (Exception ex) 
      { 
      } 
     } 
     else 
     { 
     } 
    } 

看来,当在BitmapImage的图像=新的BitmapImage()的断点,我得到了以下例外:

ex = {System.UnauthorizedAccessException:无效的跨线程访问。 在MS.Internal.XcpImports.CheckThread() 在System.Windows.DependencyObject..ctor(UInt32的nativeTypeIndex,IntPtr的constructDO) 在System.Windows.Media.Imaging.BitmapImage..ctor()

还有什么我可以尝试摆脱这个错误吗?

回答

1

回调方法在后台线程中运行,而不是在UI线程中运行。不幸的是,BitmapImage只能在UI线程中实例化。如果您需要从回调访问UI线程,请尝试以下操作:

Deployment.Current.Dispatcher.BeginInvoke(() => 
    { 
     BitmapImage image = new BitmapImage(); 
     image.SetSource(e.Result); 
     SecondTile.Source = image; 
    });