异步任务Android Xamarin
我正在尝试从URL加载一个图像,以便稍后将其合并到列表记录中。问题在于它不会等待异步任务完成。它执行add,但映像为null,因为异步方法尚未完成 如何让它等待图像加载后再将记录添加到列表中异步任务Android Xamarin,android,asynchronous,xamarin,task,Android,Asynchronous,Xamarin,Task,我正在尝试从URL加载一个图像,以便稍后将其合并到列表记录中。问题在于它不会等待异步任务完成。它执行add,但映像为null,因为异步方法尚未完成 如何让它等待图像加载后再将记录添加到列表中 private JavaList<Spacecraft> GetSpacecrafts() { spacecrafts = new JavaList<Spacecraft>(); Spacecraft s; foreach (DataRow row in tb
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 JavaList GetSpacecrafts()
{
spacecrafts=newJavaList();
宇宙飞船;
foreach(tbs.行中的数据行)
{
var t=Task.Run(()=>CallMethod(行[“nueve_seis”].ToString());
t、 等待();
s=新航天器(第[“nombre”]、第[“uno_cutrocuatro”]、第[“nombre”]、第[“nombre”]、第[“desc”]、第[“urllocal”]、第[“urlPublica”]、第[“cuatro_ocho”]行、第[“siete_dos”]、第[“nueve_seis”]、第[“urllocal”]、第[“urlPublica”]、第[“cuatro_ocho”]行、第[“siete(dos”]、第[“siete(行、ToString”)行,图像位图);
宇宙飞船.添加(s);
}
异步void调用方法(字符串nameimage)
{
等待ejecutareaasync(nameimage);
}
异步任务EjecutaTareaAsync(字符串路径img)
{
等待任务。运行(()=>
{
imageBitmap=null;
imageBitmap=GetImageBitmapFromUrl(路径img);
});
}
返回航天器;
}
私有位图GetImageBitmapFromUrl(字符串url)
{
使用(var webClient=new webClient())
{
var imageBytes=webClient.DownloadData(url);
if(imageBytes!=null&&imageBytes.Length>0)返回BitmapFactory.DecodeByteArray(imageBytes,0,imageBytes.Length);
}
返回null;
}
好,让我们从顶部开始。当您调用方法(…)时,您希望它在foreach中等待。因此,让我们将该方法设置为异步方法。之后,在方法调用之前添加wait
设置异步/等待调用的方式是多余的。因此,我删除了其中一个方法并进行了一些整合
一本非常好的书,他们讨论了如何使用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;
}
private async JavaList GetSpacecrafts()
{
spacecrafts=newJavaList();
宇宙飞船;
foreach(tbs.行中的数据行)
{
var t=await CallMethod(行[“nueve_seis”].ToString());
s=新航天器(第[“nombre”]、第[“uno_cutrocuatro”]、第[“nombre”]、第[“nombre”]、第[“desc”]、第[“urllocal”]、第[“urlPublica”]、第[“cuatro_ocho”]行、第[“siete_dos”]、第[“nueve_seis”]、第[“urllocal”]、第[“urlPublica”]、第[“cuatro_ocho”]行、第[“siete(dos”]、第[“siete(行、ToString”)行,图像位图);
宇宙飞船.添加(s);
}
返回航天器;
}
异步任务调用方法(字符串名称图像)
{
返回等待任务。运行(()=>
{
imageBitmap=null;
imageBitmap=GetImageBitmapFromUrl(路径img);
});
}
私有位图GetImageBitmapFromUrl(字符串url)
{
使用(var webClient=new webClient())
{
var imageBytes=webClient.DownloadData(url);
if(imageBytes!=null&&imageBytes.Length>0)返回BitmapFactory.DecodeByteArray(imageBytes,0,imageBytes.Length);
}
返回null;
}
好,让我们从顶部开始。当您调用方法(…)时,您希望它在foreach中等待。因此,让我们将该方法设置为异步方法。之后,在方法调用之前添加wait
设置异步/等待调用的方式是多余的。因此,我删除了其中一个方法并进行了一些整合
一本非常好的书,他们讨论了如何使用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;
}
private async JavaList GetSpacecrafts()
{
spacecrafts=newJavaList();
宇宙飞船;
foreach(tbs.行中的数据行)
{
var t=await CallMethod(行[“nueve_seis”].ToString());
s=新航天器(第[“nombre”]、第[“uno_cutrocuatro”]、第[“nombre”]、第[“nombre”]、第[“desc”]、第[“urllocal”]、第[“urlPublica”]、第[“cuatro_ocho”]行、第[“siete_dos”]、第[“nueve_seis”]、第[“urllocal”]、第[“urlPublica”]、第[“cuatro_ocho”]行、第[“siete(dos”]、第[“siete(行、ToString”)行,图像位图);
宇宙飞船.添加(s);
}
返回航天器;
}
异步任务调用方法(字符串名称图像)
{
返回等待任务。运行(()=>
{
imageBitmap=null;
imageBitmap=GetImageBitmapFromUrl(路径img);
});
}
私有位图GetImageBitmapFromUrl(字符串url)
{
使用(var webClient=new webClient())
{
var imageBytes=webClient.DownloadData(url);
if(imageBytes!=null&&imageBytes.Length>0)返回BitmapFactory.DecodeByteArray(imageBytes,0,imageBytes.Length);
}
返回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
}
专用异步任务GetImageBitmapFromUrl(字符串url)
{
Uri参数url=新Uri(url);
var webClient=新的webClient();
var imageBytes=wait webClient.downloaddatataskancy(param_url);
if(imageBytes!=null&&imageBytes.Length>0)返回BitmapFactory.DecodeByteArray(imageBytes,0,imageBytes.Length);
返回null;
}
void ejecutareaasync(字符串路径)
{
Task.Run(async()=>{imageBitmap=Wait GetImageBitmapFromUrl(pathimg);}).Wait();//这将等待任务完成
}
使用此代码,它可能会对您有所帮助
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
}
专用异步任务GetImageBitmapFromUrl(字符串url)
{
Uri参数url=新Uri(url);
var webClient=新的webClient();
var imageBytes=wait webClient.downloaddatataskancy(param_url);
if(imageBytes!=null&&imageBytes.Length>0)返回BitmapFactory.DecodeByteArray(imageBytes,0,imageBytes.Length);
返回null;
}
void ejecutareaasync(字符串路径)
{
Task.Run(async()=>{imageBitmap=Wait GetImageBitmapFromUrl(pathimg);}).Wait();//这将等待任务完成
}