问题是同步调用工作,但异步不工作。
同步呼叫:
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;
}发布于 2014-04-03 12:47:55
一般说来, to create asynchronous wrappers for synchronous methods.
在这个特殊的例子中,我认为您遇到了一个问题,因为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;
}https://stackoverflow.com/questions/22831162
复制相似问题