2

さまざまな 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);
}

現在、json1 と json2 は、DoSomethingWithJson() 内の MessageBox に表示しようとすると常に null 値を返します。これは、完全にダウンロードされていないことが原因である可能性があると想定しています。

4

1 に答える 1

2

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();
于 2013-07-31T14:03:51.803 に答える