2014-11-22 2 views
2

Я читал о программировании async-wait, и я смущен в сценарии, где я хочу, чтобы функция выполнялась асинхронно. Например, я хочу отобразить изображение в моем пользовательском интерфейсе. Итак, в потоке пользовательского интерфейса я вызываю функцию, которая извлекает изображение из хранилища и применяет изображение к пользовательскому интерфейсу.Как запустить функцию async

Каков правильный способ сделать это?

МЕТОД 1

private async void SetImage() 
{ 
    await Task.Run(() => 
    { 
     byte[] fullViewImageBytes = Utils.GetImageFromStorage(fileName); 

     if (fullViewImageBytes != null) 
     { 
      Deployment.Current.Dispatcher.BeginInvoke(() => 
      { 
       MemoryStream memStream = new MemoryStream(fullViewImageBytes); 
       BitmapImage image = new BitmapImage(); 
       image.SetSource(memStream); 
       userImage.Source = image; 
      }); 
     } 
    } 
} 

МЕТОД 2

private async void SetImage() 
{ 
    await Task.Delay(1); 

    byte[] fullViewImageBytes = Utils.GetImageFromStorage(fileName); 

    if (fullViewImageBytes != null) 
    { 
     MemoryStream memStream = new MemoryStream(fullViewImageBytes); 
     BitmapImage image = new BitmapImage(); 
     image.SetSource(memStream); 
     userImage.Source = image; 
    } 
} 
+2

Ни один из них на самом деле используют силу за асинхронной-ОЖИДАНИЕ. Во всяком случае, 'GetImageFromStorage' должен быть асинхронной операцией, и это, вероятно, единственное, что нужно ждать. Обратите внимание, что вы должны иметь подпись async Task. –

ответ

4

Как чтение файла с диска в основном о асинхронной IO, вы может воспользоваться возраст широкого спектра асинхронного API, предоставляемого платформой Windows Phone.

Нет необходимости использовать Task.Factory.StartNew или Task.Run, то есть нет необходимости в дополнительной теме ThreadPool. В настоящее время ваш код не является по-настоящему асинхронным, и обратите внимание, что async void предназначен только для обработчиков событий верхнего уровня и не должен использоваться иначе.

Вы можете воспользоваться асинхронным API следующим образом:

public async Task<BitmapImage> CreateImageFromFileAsync(string imagePath) 
{ 
    StorageFile storageFile = await StorageFile.GetFileFromPathAsync(imagePath); 
    IRandomAccessStream imageFileStream = await storageFile.OpenReadAsync(); 

    BitmapImage image = new BitmapImage(); 
    await image.SetSourceAsync(imageFileStream); 

    return image; 
} 
0

Что-то вроде этого:

private static async Task<BitmapImage> GetImageFromStorageAsync(string fileName) 
{ 
    var bytes = await Task.Factory 
       .StartNew((f)=>Utils.GetImageFromStorage((string)f), fileName) 
       .ConfigureAwait(false); 
    MemoryStream memStream = new MemoryStream(bytes); 
    BitmapImage image = new BitmapImage(); 
    image.SetSource(memStream); 
    return image; 
} 

private async Task SetImage() 
{ 
    var image = await GetImageFromStorageAsync(fileName); 
    userImage.Source = image; 
} 
Смежные вопросы