C# 使用Async Await存储和检索图像时发生TargetInvestment异常

C# 使用Async Await存储和检索图像时发生TargetInvestment异常,c#,windows-phone-8,asynchronous,async-await,C#,Windows Phone 8,Asynchronous,Async Await,我已经在这上面呆了一段时间了,很明显我错过了一些东西。我在应用程序中使用异步等待方法从PhotoChooserTask存储和检索图像。如果用户希望使用PhotoChooserTask选择图像,我会保存该图像,然后将其显示给用户。第一次这样做效果很好。第二次出现System.Reflection.TargetInvocationException错误时。据我所知,这似乎是在再次调用PhotoChooserTask之后发生的,我通过保存/检索过程将图像显示给用户并保存在存储器中。下面是我的代码,以及

我已经在这上面呆了一段时间了,很明显我错过了一些东西。我在应用程序中使用异步等待方法从PhotoChooserTask存储和检索图像。如果用户希望使用PhotoChooserTask选择图像,我会保存该图像,然后将其显示给用户。第一次这样做效果很好。第二次出现System.Reflection.TargetInvocationException错误时。据我所知,这似乎是在再次调用PhotoChooserTask之后发生的,我通过保存/检索过程将图像显示给用户并保存在存储器中。下面是我的代码,以及错误的屏幕截图。我无法缩小问题发生的确切范围

设置spage.xaml.cs

在tombstonighelper.cs中完成存储/检索

public async Task StorePhoto(Stream photoStream, string fileName)
{
  // persist data into isolated storage
  StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);

  using (Stream current = await file.OpenStreamForWriteAsync())
  {
    await photoStream.CopyToAsync(current);
  }
}

public async Task<BitmapImage> RetrievePhoto(string fileName)
{
  StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(fileName);
  Stream imageStream = await file.OpenStreamForReadAsync();

  // display the file as image
  BitmapImage bi = new BitmapImage();
  bi.SetSource(imageStream);

  return bi;
}
错误呢

在OnNavigatedTo和PhotoChooserTask方法中添加try-catch块后编辑**


我有两个页面,一个主页和一个设置页面。SettingsPage是我使用PhotoChooserTask并向用户显示结果的地方,这样用户可以决定是否选择其他图像。实际上,我在主页中使用了该图像。当用户选择要在主页中显示的图像后,从设置页面返回,然后返回设置页面选择另一个图像时,就会发生此错误。如果用户从应用程序列表或启动屏幕启动应用程序,然后直接转到设置页面,则不会出现问题。基本上,一旦用户从SettingsPage中选择图像,然后返回SettingsPage以选择新图像,就会发生错误,但如果用户从新状态启动应用程序,然后进入SettingsPage以选择图像,则一切正常。在同一个应用程序实例中,当返回到SettingsPage并选择一个图像时,我遇到的错误是访问被拒绝。来自HRESULT的异常:0x80070005 E_ACCESSDENIED。

您必须在代码周围放置try catch,并检查内部异常。消息显示内部异常是实际问题。@nvoigt您的请求已被接受:@loop您的意思是在最外层的StorePhoto方法中放置一个try catch。因为您的应用程序正在崩溃,所以异常将达到此代码的所有以上级别。事实上,我以前也遇到过同样的问题。e、 g适用于两种情况。photoChooserTask_已完成,已导航到并捕获异常并查看消息。好的,这很有趣。当第一次从PhotoChooser任务收集图像时,我在OnNavigatedTo中捕获到一个异常,说明数组的偏移量和长度超出了范围,或者计数大于从索引到源集合末尾的元素数。但图像加载良好。当我使用PhotoChooserTask获取新照片时,我在PhotoChooserTask方法中捕获一个异常,声明访问被拒绝。来自HRESULT的异常:0x80070005 E_访问被拒绝。
public async Task StorePhoto(Stream photoStream, string fileName)
{
  // persist data into isolated storage
  StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);

  using (Stream current = await file.OpenStreamForWriteAsync())
  {
    await photoStream.CopyToAsync(current);
  }
}

public async Task<BitmapImage> RetrievePhoto(string fileName)
{
  StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(fileName);
  Stream imageStream = await file.OpenStreamForReadAsync();

  // display the file as image
  BitmapImage bi = new BitmapImage();
  bi.SetSource(imageStream);

  return bi;
}