0

我有一个绑定在 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;
   }
}

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

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

4

3 回答 3

2

我有一个类似的问题:WinRT: Loading static data with GetFileFromApplicationUriAsync()

请看亚历山大的回答。

于 2012-10-26T13:20:19.977 回答
0

物业在等待任务吗?如果是这样,您有一个同步上下文问题。

于 2012-10-26T13:03:23.383 回答
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 的原因是因为此代码位于属性中,您不能使用 async 。

于 2012-10-27T09:54:40.407 回答