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

わかりやすくするために(上記の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. 呼び出しコードが await を使用するのではなく GetBitmapStreamAsync(file).Result になる理由は、このコードが非同期を使用できないプロパティにあるためです。

于 2012-10-27T09:54:40.407 に答える
0

プロパティはタスクを待機していますか? その場合、同期コンテキストの問題があります。

于 2012-10-26T13:03:23.383 に答える