异步下载不起作用,同步下载不起作用
本文关键字:下载 不起作用 同步 异步 | 更新日期: 2023-09-27 17:56:33
问题是同步调用有效,但异步调用不起作用。
同步呼叫:
using (var bmp = GetImageBitmapFromUrl (item.Image))
{
imgNewsItem.SetImageBitmap (bmp);
bmp.Dispose ();
}
异步调用:
LoadNewsItemImageAsync (imgNewsItem, item.Image);
异步功能:
public async void LoadNewsItemImageAsync(ImageView v, string url)
{
using (Bitmap bmp = await GetImageBitmapFromUrlAsync(url))
{
v.SetImageBitmap (bmp);
bmp.Dispose ();
}
}
Task<Bitmap> GetImageBitmapFromUrlAsync (string url)
{
return Task.Run<Bitmap>(() => GetImageBitmapFromUrl (url));
}
以下函数在未通过异步任务运行时有效
Bitmap GetImageBitmapFromUrl(string url)
{
Bitmap imageBitmap = null;
try {
using (var webClient = new WebClient())
{
var imageBytes = webClient.DownloadData(url);
if (imageBytes != null && imageBytes.Length > 0)
{
imageBitmap = BitmapFactory.DecodeByteArray(imageBytes, 0,
imageBytes.Length);
}
} catch (Exception ex) {
Log.WriteLine (LogPriority.Error, "GetImageFromBitmap Error", ex.Message);
}
return imageBitmap;
}
通常,不应使用 Task.Run
为同步方法创建异步包装器。
在此特定实例中,我相信您遇到了问题,因为Bitmap
是UI仿射类型。 Bitmap
就像 UI 控件一样;您应该仅从 UI 线程访问它。
请考虑以下GetImageBitmapFromUrlAsync
实现:
async Task<Bitmap> GetImageBitmapFromUrlAsync(string url)
{
Bitmap imageBitmap = null;
try {
using (var webClient = new WebClient())
{
var imageBytes = await webClient.DownloadDataTaskAsync(url);
if (imageBytes != null && imageBytes.Length > 0)
{
imageBitmap = BitmapFactory.DecodeByteArray(imageBytes, 0,
imageBytes.Length);
}
} catch (Exception ex) {
Log.WriteLine (LogPriority.Error, "GetImageFromBitmap Error", ex.Message);
}
return imageBitmap;
}