Xamarin.iOS异步等待方法不工作

本文关键字:工作 方法 等待 iOS 异步 Xamarin | 更新日期: 2023-09-27 18:00:58

我正在C#中用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加载图像?

Xamarin.iOS异步等待方法不工作

您在示例中显示的代码不是异步的。如果你想加载所有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;
}