2016-08-10 2 views
0

Я пытаюсь загрузить несколько фотографий из Интернета асинхронно. Я построил метод GetImageBitmapFromUrl следующимиспользуя ожидание внутри сеттеров

async Task<Bitmap> GetImageBitmapFromUrl(string url) 
{ 
    Bitmap imageBitmap = null; 
    try 
    { 
     using (var webClient = new WebClient()) 
     { 
      var imageBytes = await webClient.DownloadStringTaskAsync(url); 
      if (imageBytes != null && imageBytes.Length > 0) 
      { 
       imageBitmap = BitmapFactory.DecodeByteArray(Encoding.ASCII.GetBytes(imageBytes), 0, imageBytes.Length); 
      } 
     } 
    } 
    catch 
    { 
     //Silence is gold. 
    } 
    return imageBitmap; 
} 

Я сейчас пытаюсь вызвать этот метод в моем инкубаторе

List<string> _pictures; 
Bitmap[] imageBitmap; 
int currentPic = 0; 
ImageView gellaryViewer; 
public List<string> pictures 
{ 
    set 
    { 
     if (value.Count == 0) 
     { 
      gellaryViewer.Visibility = ViewStates.Gone; 
     } 
     else 
     { 
      gellaryViewer.Visibility = ViewStates.Visible; 
      _pictures = value; 
      currentPic = 0; 
      imageBitmap = new Bitmap[value.Count]; 
      for (int i = 0; i < value.Count; i++) 
       //The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'. 
       imageBitmap[i] = await GetImageBitmapFromUrl(value[i]); 
      displayPic(); 
     } 
    } 
    get { return _pictures; } 
} 

Но я получаю эту ошибку
The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'.

Как могу ли я пометить установщика с помощью модификатора «async»?

ответ

0

Простой ответ: вы не можете. Все свойства (как get, так и set) и синхронные. Сохраните функцию async, и вы в порядке.

Комплексный ответ: вы можете, но это уродливо. Сделайте функцию async частной, и назовите ее из вашего метода set. Но так как set является синхронным, тогда как вызывающий метод async, вам придется сделать этот вызов по-разному. Посмотрите на this SO post для различных вариантов.

Настоящая записка эта последняя опция должна использоваться только тогда, когда у вас нет другой опции. Отладка может быть сложной, и вы можете столкнуться с условиями гонки, которых вы не хотите.

0

Проверьте ответ на этот вопрос: How to call an async method from a getter or setter?.

Это, как говорится, я настоятельно рекомендую перенести функциональность обновления из свойства в отдельный метод. Свойства предназначены для обеспечения текущего состояния вещей, а не для неограниченного блокирования.

Смежные вопросы