2个异步下载请求,但第二个请求取决于第一个请求的结果——如何同步
本文关键字:请求 何同步 同步 结果 第一个 下载 异步 第二个 2个 取决于 | 更新日期: 2023-09-27 18:22:18
编辑:对不起,现在我对问题有了更好的理解,我认为我的问题在其他地方
我有两个异步请求。
第一个是:
public void DownloadWebData(Uri apiUrl)
{
WebClient client = new WebClient();
client.DownloadDataCompleted += DownloadDataCompleted;
client.DownloadDataAsync(apiUrl);
}
public void DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
{
string result = System.Text.Encoding.UTF8.GetString (e.Result);
Uri downloadLink = (GetUri(result));
}
基本上,它向远程Web服务器发出一个简单的基于url的API请求,该请求通过http返回一些基本的文本数据。GetUri()只是解析该数据,从数据中提取一个地址供图像下载。
然后我在monotouch.dialog中使用imageLoader来下载图像。所有代码都在同一个类中。
编辑:添加了imageLoader代码(我保留了Console行,因为它们相当好地充当了注释)
public void downloadImage (Uri imageUri)
{
var tmp_img = ImageLoader.DefaultRequestImage (imageUri, this);
if (tmp_img != null)
{
adView.Image = tmp_img;
Console.WriteLine ("Image already cached, displaying");
}
else
{
adView.Image = UIImage.FromFile ("Images/downloading.jpg");
Console.WriteLine ("Image not cached. Using placeholder.");
}
}
public void UpdatedImage (System.Uri uri)
{
adView.Image = ImageLoader.DefaultRequestImage(uri, this);
}
您错过了检查e.Result
是否真的包含某些内容。下载可能已经失败,并且e.Result
是null
。在代码中添加一些基本的错误处理。
如果在for循环中使用DownloadWebData,最好为DownloadDataCompleted事件生成单独的函数。您可以在DownloadWebData()中使用匿名函数。
client.DownloadDataCompleted +=(s,e)=>{
string result = System.Text.Encoding.UTF8.GetString (e.Result);
Uri downloadLink = (GetUri(result));
};
在意识到我问错了问题后,我终于在这里找到了答案:
异步图像下载后,将控制权交还给主UI线程以更新UI