2016-08-10 4 views
0

Ich versuche, einige Bilder aus dem Internet asynchron herunterladen. Ich habe die GetImageBitmapFromUrl Methode folgendmit erwarten innerhalb Setter

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; 
} 

gebaut ich jetzt versuchen, diese Methode in meinem Setter zu nennen

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; } 
} 

Aber ich bekomme diese Fehlermeldung
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'.

Wie kann ich den Setter mit dem Modifizierer 'async' markieren?

Antwort

0

Einfache Antwort: Sie können nicht. Alle Eigenschaften (sowohl get als auch set) und synchron. Halte es eine async Funktion und du bist gut.

Komplexe Antwort: Sie können, aber es ist hässlich. Machen Sie die async Funktion zu einer privaten und rufen Sie sie von Ihrer set Methode. Aber da die set synchron ist, während die aufrufende Methode async ist, müssen Sie diesen Aufruf anders machen. Schauen Sie sich this SO post für verschiedene Optionen an.

Diese Notiz diese letzte Option sollte nur verwendet werden, wenn Sie keine andere Option haben. Das Debugging könnte schwierig sein und Sie könnten in Race Conditions geraten, die Sie nicht passieren wollen.

0

Überprüfen Sie die Antwort auf diese Frage: How to call an async method from a getter or setter?.

Das wird gesagt, ich würde sehr empfehlen, die Update-Funktionalität weg von der Eigenschaft auf eine separate Methode zu verschieben. Eigenschaften sollen den aktuellen Zustand der Dinge liefern, nicht unbegrenzt blockieren.