异步任务Android Xamarin

异步任务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

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

如何让它等待图像加载后再将记录添加到列表中

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();//这将等待任务完成
}