2013-04-27 5 views
2

У меня есть 8 приложение для Windows, который я пытаюсь загрузить изображение, используя следующий код:асинхронной LoadImage рутина висит

private async Task<BitmapImage> LoadImage(IStorageFile storageFile) 
    { 
     System.Diagnostics.Debug.WriteLine("LoadImage started"); 

     try 
     { 
      // Set the image source to the selected bitmap 
      BitmapImage bitmapImage = null; 

      // Ensure a file was selected 
      if (storageFile != null) 
      { 
       System.Diagnostics.Debug.WriteLine("LoadImage::OpenAsync"); 
       // Ensure the stream is disposed once the image is loaded 
       using (IRandomAccessStream fileStream = await storageFile.OpenAsync(Windows.Storage.FileAccessMode.Read)) 
       { 
        System.Diagnostics.Debug.WriteLine("New Bitmap"); 
        // Set the image source to the selected bitmap 
        bitmapImage = new BitmapImage(); 


        System.Diagnostics.Debug.WriteLine("Set Source"); 
        bitmapImage.SetSource(fileStream); 
       } 
      } 

      return bitmapImage; 
     } 
     catch (Exception ex) 
     { 
      System.Diagnostics.Debug.WriteLine(ex.ToString()); 
     } // End of catch 
     finally 
     { 
      System.Diagnostics.Debug.WriteLine("Load image finished"); 
     } 

     return null; 
    } 

Когда я запускаю код иногда работает. Но иногда он просто зависает и я получаю следующий результат:

 
LoadImage started 
LoadImage::OpenAsync 

я использую storageFile.OpenAsAsync неправильно? Мой файл хранение является результатом вызова:

 FileOpenPicker openPicker = new FileOpenPicker(); 
     openPicker.ViewMode = PickerViewMode.List; 
     openPicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary; 

     openPicker.FileTypeFilter.Add(".jpg"); 
     openPicker.FileTypeFilter.Add(".png"); 
     openPicker.FileTypeFilter.Add(".bmp"); 

     StorageFile file = await openPicker.PickSingleFileAsync(); 
     if (file != null) 
     { 
      var loadImageTask = LoadImage(currentStorageFile); 
      loadImageTask.Wait(); 
      DisplayImage.Source = loadImageTask.Result; 
     } 

Так что это не должно быть проблемой песочницы (а не исключение).

Может ли кто-нибудь указать мне правильный путь?

+0

Есть ли у вас вызов 'Task.Wait' или' Task.Result' где-то дальше в вашем стеке вызовов? –

+0

Да, у меня есть: var loadImageTask = LoadImage (currentStorageFile); loadImageTask.Wait(); DisplayImage.Source = loadImageTask.Result; – Kyle

ответ

3

Звонок в Task.Wait и Task.Result вызывает тупик. Я подробно объясню это on my blog и in a recent MSDN article.

Короче говоря, когда вы awaitTask, который еще не завершен, по умолчанию он будет захватывать «контекст» и использовать, чтобы возобновить метод async. В вашем случае это контекст пользовательского интерфейса. Однако, когда вы вызываете Wait (или Result), вы блокируете поток пользовательского интерфейса, поэтому метод async не может завершить.

Чтобы исправить это, используйте await вместо Wait/Result и использовать ConfigureAwait(false) везде вы можете.