2016-08-05 1 views
1

Xamarin에서 C#으로 iOS 응용 프로그램을 개발 중이며, 비동기 모드에서 호출해야하는 메서드가 있습니다. 나는 this 가이드 라인을 가지고 있지만 내 요구와 다른 것 같다.Xamarin.iOS async await 메서드가 작동하지 않습니다.

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() 메서드가 비동기 속성을 누락 한 것으로 보입니다. url asynchrously에서 이미지를로드하는 다른 방법이 있습니까?

+0

(DB 접근, 네트워크 호출 등) 비동기해야 비트를 표시하도록 코드를 업데이트하시기 바랍니다. – Jason

+0

@ Jason 방금 편집했습니다 .... – pasluc74669

+0

해당 작업 중 어느 것도 비동기입니다. 원하는 경우 다른 스레드에서 수동으로 실행할 수 있지만 본질적으로 비동기 작업은 아닙니다. – Jason

답변

2

예제에 표시된 코드는 비동기 적이 지 않습니다. 또한

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에있는 코드 : 모든 6 개 이미지를로드하려면, 당신은 아마 이런 식으로 뭔가를 갖고 싶어. 당신은 비동기 적으로 데이터를로드 한 다음이 바이트 배열에서 이미지를 만들 수 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