2016-08-05 4 views
1

Ich entwickle eine iOS-App in Xamarin in C#, ich habe eine Methode, die im asynchronen Modus aufgerufen werden muss. Ich habe this Richtlinie, aber es scheint anders zu sein als meine Bedürfnisse.Xamarin.iOS async warten Methode funktioniert nicht

Ich habe versucht, dies zu tun:

var tasks = new List<Task<UIImage>>(); 
      var imageUrls = new[] { 
       "http://www.mySite/images/02.jpg", 
       "http://www.mySite/images/03.jpg", 
       "http://www.mySite/images/04.jpg", 
       "http://www.mySite/images/05.jpg", 
       "http://www.mySite/images/06.jpg", 
       "http://www.mySite/images/07.jpg", 
       "http://www.mySite/images/08.jpg", 
       "http://www.mySite/images/09.jpg", 
       "http://www.mySite/images/10.jpg", 
       "http://www.mySite/images/11.jpg", 
       "http://www.mySite/images/12.jpg", 
       "http://www.mySite/images/3.jpg", 
       "http://www.mySite/images/14.jpg", 
       "http://www.mySite/images/15.jpg" 

      }; 
    foreach (var imageUrl in imageUrls) 
      { 
       var task = getImageFromUrl(imageUrl); 
       tasks.Add(task); 
      } 
      var images = await Task.WhenAll(tasks); 

die aufgerufene Methode ist:

async Task<UIImage> getImageFromUrl(string uri) 
    { 
     using (var url = new NSUrl(uri)) 
     using (var data = NSData.FromUrl(url)) 
      return UIImage.LoadFromData(data); 
    } 

es läuft synchron, und zeigt mir die folgende Warnung:

Warning CS1998: Async block lacks `await' operator and will run synchronously (CS1998) 

Was bin ich fehlt in meinem Code? Es scheint, dass die getImageFromUrl() -Methode eine asynchrone Eigenschaft vermisst. Gibt es eine andere Möglichkeit, Bilder von URL asynchron zu laden?

+0

Bitte aktualisieren Sie Ihren Code, um die Bits zu zeigen, dass async (db Zugriff, Netzanruf, etc.) sein müssen. – Jason

+0

@Jason gerade bearbeitet .... – pasluc74669

+0

keine dieser Operationen sind async. Sie können sie auch manuell in einem anderen Thread ausführen, sie sind jedoch keine asynchronen Vorgänge. – Jason

Antwort

2

Der Code, den Sie in Ihrem Beispiel gezeigt haben, ist nicht asynchron. Wenn Sie alle 6 Bilder laden möchten, möchten Sie wahrscheinlich so etwas haben:

var tasks = new List<Task<UIImage>>(); 
var imageUrls = new[] {"http://www.mySite/images/02.jpg", ... "http://www.mySite/images/09.jpg"}; 
foreach (var imageUrl in imageUrls) { 
    var task = // invoke a method which loads an image asynchronously and returns a Task, but don't call await on this Task 
    tasks.Add(task); 
} 
var images = await Task.WhenAll(tasks); 

auch den Code, den Sie in getImageFromUrl hat keine asynchronen Methoden aufrufen. Sie können prüfen, HttpClient.GetByteArrayAsync unter Verwendung von Daten asynchron zu laden und dann ein Bild von diesem Byte-Array erstellen:

async Task<UIImage> getImageFromUrl(string uri) 
{ 
    using (var httpClient = new HttpClient()) 
    var imageBytes = await httpClient.GetByteArrayAsync(uri); 
    var image = // create image from imageBytes; 
    return image; 
} 
+0

Ich habe meinen Beitrag aktualisiert, aber das Problem ist das gleiche, wo liege ich falsch in meinem Code? – pasluc74669

+0

Ihr Code hat keine asynchronen Operationen aufgerufen, siehe meine aktualisierte Antwort – oldbam

+0

Dies ist genau das, was ich brauche !!!! – pasluc74669

Verwandte Themen