c# - 在执行函数之前如何检查WebClient下载是否完成?

标签 c# windows-phone webclient

我正在尝试从不同的 URL 获取 JSON 文件。在尝试执行其他操作之前,如何确保两个文件都已完全下载。

我的代码看起来像这样:

WebClient Url1 = new WebClient();
Url1.DownloadStringCompleted += new DownloadStringCompletedEventHandler(Url1_DownloadStringCompleted);
Url1.DownloadStringAsync(new Uri("http://example.com"));
WebClient Url2 = new WebClient();
Url2.DownloadStringCompleted += new DownloadStringCompletedEventHandler(Url2_DownloadStringCompleted);
Url2.DownloadStringAsync(new Uri("http://anotherexample.com"));

DoSomethingWithJson();

void Url1_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    if (e.Error != null) 
        return;
    json1 = JObject.Parse(e.Result);
}

void Url2_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    if (e.Error != null) 
        return;
    json2 = JObject.Parse(e.Result);
}

现在,每当我尝试在 DoSomethingWithJson() 内的 MessageBox 中显示 json1 和 json2 时,都会返回 null 值,我假设这可能是因为它们尚未完全下载。

最佳答案

DownloadStringAsync() 方法在下载字符串之前返回,因为它是异步方法。如果您将 DoSomethingWithJson() 方法移至已完成的处理程序,那么请求完成后就会调用该方法。您可能需要向 DoSomethingWithJson() 方法添加逻辑,以便只有在填充了所需的所有变量时它才起作用(如果确实需要在开始执行其他操作之前填充所有变量) )。

WebClient Url1 = new WebClient();
Url1.DownloadStringCompleted += new DownloadStringCompletedEventHandler(Url1_DownloadStringCompleted);
Url1.DownloadStringAsync(new Uri("http://example.com"));
WebClient Url2 = new WebClient();
Url2.DownloadStringCompleted += new DownloadStringCompletedEventHandler(Url2_DownloadStringCompleted);
Url2.DownloadStringAsync(new Uri("http://anotherexample.com"));
var json1Done = false;
var json2Done = false;


void Url1_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    if (e.Error != null) 
        return;
    json1 = JObject.Parse(e.Result);
    json1Done = true;
    if(json1Done && json2Done)
    {
        DoSomethingWithJson();
    }
}

void Url2_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    if (e.Error != null) 
        return;
    json2 = JObject.Parse(e.Result);
    json2Done = true;
    if(json1Done && json2Done)
    {
        DoSomethingWithJson();
    }
}

或者,如果您使用 .Net 4.5,那么您可以使用新的 async/await 功能:

WebClient Url1 = new WebClient();
var json1Task = Url1.DownloadStringTaskAsync(new Uri("http://example.com"));
WebClient Url2 = new WebClient();
var json2Task = Url2.DownloadStringTaskAsync(new Uri("http://anotherexample.com"));

json1 = await json1Task;
json2 = await json2Task;

DoSomethingWithJson();

关于c# - 在执行函数之前如何检查WebClient下载是否完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17971984/

相关文章:

c# - 关于C#中接口(interface)使用的问题

windows-phone - IpOverUsbSvc 错误

vb.net - WP7 - 更新列表框

c# - 从 Windows Phone 8 共享

c# - 在共享 (.shproj) 项目中添加引用

c# - WebClient.DownloadData 挂起

C# - 如何进行 HTTP 调用

c# - 如何移动/排列所有桌面窗口? (即 "Show Windows Stacked"

c# - 返回对象的实例

c# - 使用通配符比较两个字符串