async Task Android Xamarin



我正在尝试从URL加载图像,以便稍后将其合并到列表记录中。问题是它不会等待异步任务完成。它执行添加,但图像为空,因为异步方法尚未完成。

如何让它等到图像加载完毕,然后将记录添加到列表中?

private JavaList<Spacecraft> GetSpacecrafts()
{
spacecrafts = new JavaList<Spacecraft>();
Spacecraft s;
foreach (DataRow row in tbs.Rows)
{
var t = Task.Run(() => CallMethod(row["nueve_seis"].ToString()));
t.Wait();
s = new Spacecraft(row["nombre"].ToString(),,row["uno_cutrocuatro"].ToString(), row["nombre"].ToString(), row["desc"].ToString(), row["urllocal"].ToString(), row["urlPublica"].ToString(), row["cuatro_ocho"].ToString(), row["siete_dos"].ToString(), row["nueve_seis"].ToString(), row["uno_cutrocuatro"].ToString(), row["uno_nuevedos"].ToString(), imageBitmap);
spacecrafts.Add(s);
}
async void CallMethod(string nameimage)
{
await EjecutaTareaAsync(nameimage);
}
async Task EjecutaTareaAsync(string pathimg)
{
await Task.Run(() =>
{
imageBitmap = null;
imageBitmap = GetImageBitmapFromUrl(pathimg);
});
}
return spacecrafts;
}
private Bitmap GetImageBitmapFromUrl(string url)
{
using (var webClient = new WebClient())
{
var imageBytes = webClient.DownloadData(url);
if (imageBytes != null && imageBytes.Length > 0) return BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);
}
return null;
}

使用此代码,它可能会对您有所帮助

private async Task<Bitmap> GetImageBitmapFromUrl(string url)
{
Uri param_url = new Uri(url);
var webClient = new WebClient();
var imageBytes = await webClient.DownloadDataTaskAsync(param_url);
if (imageBytes != null && imageBytes.Length > 0) return BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);
return null;
}
void EjecutaTareaAsync(string pathimg)
{
Task.Run(async() =>{ imageBitmap =await GetImageBitmapFromUrl(pathimg); }).Wait(); //this will wait until task completed
}

好的,让我们从顶部开始。您希望它在调用方法(...(时在foreach中等待。因此,让我们使该方法成为异步方法。然后在方法调用之前添加 await。

设置异步/等待调用的方式是多余的。 所以我删除了其中一种方法并进行了一些整合。

https://blog.xamarin.com/getting-started-with-async-await/很好的读物,他们谈论如何使用async/await。 这可能会有所帮助。

private async JavaList<Spacecraft> GetSpacecrafts()
{
spacecrafts = new JavaList<Spacecraft>();
Spacecraft s;
foreach (DataRow row in tbs.Rows)
{
var t = await CallMethod(row["nueve_seis"].ToString());
s = new Spacecraft(row["nombre"].ToString(),,row["uno_cutrocuatro"].ToString(), row["nombre"].ToString(), row["desc"].ToString(), row["urllocal"].ToString(), row["urlPublica"].ToString(), row["cuatro_ocho"].ToString(), row["siete_dos"].ToString(), row["nueve_seis"].ToString(), row["uno_cutrocuatro"].ToString(), row["uno_nuevedos"].ToString(), imageBitmap);
spacecrafts.Add(s);
}
return spacecrafts;
}
async Task CallMethod(string nameimage)
{
return await Task.Run(() =>
{
imageBitmap = null;
imageBitmap = GetImageBitmapFromUrl(pathimg);
});
}
private Bitmap GetImageBitmapFromUrl(string url)
{
using (var webClient = new WebClient())
{
var imageBytes = webClient.DownloadData(url);
if (imageBytes != null && imageBytes.Length > 0) return BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);
}
return null;
}

最新更新