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);
}

2个异步下载请求,但第二个请求取决于第一个请求的结果——如何同步

您错过了检查e.Result是否真的包含某些内容。下载可能已经失败,并且e.Resultnull。在代码中添加一些基本的错误处理。

如果在for循环中使用DownloadWebData,最好为DownloadDataCompleted事件生成单独的函数。您可以在DownloadWebData()中使用匿名函数。

client.DownloadDataCompleted +=(s,e)=>{
    string result = System.Text.Encoding.UTF8.GetString (e.Result);
    Uri downloadLink = (GetUri(result));
};

在意识到我问错了问题后,我终于在这里找到了答案:

异步图像下载后,将控制权交还给主UI线程以更新UI