调用await file.OpenAsync似乎挂起

时间:2012-10-26 12:56:55

标签: c# windows-runtime winrt-async

我有一个绑定在XAML中的属性,该属性应该从文件返回一个图像。该属性调用以下代码:

private async Task<BitmapImage> GetBitmapImageAsync(StorageFile file)
{
   Debug.WriteLine("GetBitmapImageAsync for file {0}", file.Path);
   BitmapImage bitmap = new BitmapImage();
   Debug.WriteLine("... opening the stream");
   using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read))
   {
      Debug.WriteLine("... setting the source");
      bitmap.SetSource(stream);
      Debug.WriteLine("... and returning");
      return bitmap;
   }
}

我遇到的问题是代码将输出调试文本“...打开流”然后它似乎挂起。

任何人都可以看到我做错了什么或者我可以尝试解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

我遇到了类似的问题:WinRT: Loading static data with GetFileFromApplicationUriAsync()

请看亚历山大的答案。

答案 1 :(得分:0)

物业是否在等待任务?如果是这样,则会出现同步上下文问题。

答案 2 :(得分:0)

为了清楚起见(已经对上面提供的Raubi的回答进行了评论),这里是我重新构建代码的方式,以便在没有在错误的线程上访问UI对象的情况下工作。

调用代码如下所示:

BitmapImage bitmap = new BitmapImage();
IRandomAccessStream stream = GetBitmapStreamAsync(file).Result;
bitmap.SetSource(stream);
return bitmap;

并且GetBitmapStreamAsync的代码是这样的:

private async Task<IRandomAccessStream> GetBitmapStreamAsync(StorageFile file)
{
   Debug.WriteLine("GetBitmapStreamAsync for file {0}", file.Path);
   IRandomAccessStream stream = await file.OpenReadAsync().AsTask().ConfigureAwait(false);
   return stream;
}

几点说明:

  1. 我之所以将BitmapImage的创建移动到调用代码,而不是将其保留在原始的GetBitmapImageAsync中,是因为当您使用ConfigureAwait时,代码会在不同的上执行线程然后引发异常。

  2. 调用代码为GetBitmapStreamAsync(file)的原因.Result而不是使用await是因为此代码位于Property中,您不能使用async。