2016-08-05 4 views
1

Я разрабатываю приложение iOS в Xamarin на C#, у меня есть метод, который должен вызываться в асинхронном режиме. Я получил this руководство, но он, похоже, отличается от моих потребностей.Xamarin.iOS async ждут метод не работает

Я пытался сделать это:

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

вызываемый метод:

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

он работает синхронно, и показывает мне следующее предупреждение:

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

Что я отсутствует в моем коде? Кажется, что метод getImageFromUrl() пропускает свойство async. Есть ли другой способ загрузки изображений с URL-адреса асинхронно?

+0

Пожалуйста, обновите ваш код, чтобы показать биты, которые должны быть асинхронной (доступ дб, сетевой вызов, и т.д.). – Jason

+0

@Jason только что отредактировал .... – pasluc74669

+0

Ни одна из этих операций не асинхронна. Вы можете вручную выполнить их в другом потоке, если хотите, но они не являются асинхронными. – Jason

ответ

2

Код, показанный в вашем примере, не является асинхронным. Если вы хотите, чтобы загрузить все 6 изображений, вы, вероятно, хотите иметь что-то вроде этого:

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

Кроме того, код, который вы имеете в getImageFromUrl не вызывает каких-либо асинхронных методов. Вы можете рассмотреть возможность использования HttpClient.GetByteArrayAsync для загрузки данных асинхронно, а затем создать образ из этого массива:

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

Я обновил свой пост, но проблема такая же, где я ошибаюсь в своем коде? – pasluc74669

+0

ваш код не вызывал никаких асинхронных операций, см. Мой обновленный ответ – oldbam

+0

Это именно то, что мне нужно !!!! – pasluc74669

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