2016-08-05 16 views
1

私はXamarinでC#でiOSアプリケーションを開発していますが、非同期モードで呼び出す必要があるメソッドがあります。私はthisガイドラインを持っていますが、それは私のニーズとは異なると思われます。Xamarin.iOS非同期待機メソッドが動作しない

私はこれを実行しようとしました:

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アクセス、ネットワーク呼び出しなど)asyncを指定する必要があるビットを表示するようにコードを更新してください:あなたは非同期にデータをロードしてから、このバイト配列からイメージを作成するためにHttpClient.GetByteArrayAsyncを使用して検討することができます。 – 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枚の画像をロードする場合は、おそらくこのような何かを持っていると思います。

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

関連する問題