C#の非同期処理で、async awaitを使うと処理が終わるまでawaitで待って結果を受け取ります。
WebClinentで情報を取得して結果を待って返します。
C#
1public async Task<string> ReadFromUrlAsync(Uri url) { 2 using (WebClient webClient = new WebClient()) { 3 using (Stream stream = await webClient.OpenReadTaskAsync(url)) { 4 TextReader tr = new StreamReader(stream, Encoding.UTF8, true); 5 return await tr.ReadToEndAsync(); 6 } 7 } 8} 9 10public async Task DownloadAsync() { 11 Uri url = new Uri("http://www.sample-abc.com"); 12 string body = await ReadFromUrlAsync(url); 13 Console.WriteLine(body); 14}
しかし、2つ以上のURLに同時にアクセスして、全ての結果を受け取るまで待機っていうのはどのようにするのでしょうか?
もし以下のようにしたら非同期だけど最初のurlのbodyを取得してから次のurlを取得しに行くので同期処理になります。
C#
1public async Task DownloadAsync() { 2 Uri url1 = new Uri("http://www.sample-abc.com"); 3 string body1 = await ReadFromUrlAsync(url1); 4 Console.WriteLine(body1); 5 6 Uri url2 = new Uri("http://www.sample-xyz.com"); 7 string body2 = await ReadFromUrlAsync(url2); 8 Console.WriteLine(body2); 9 10 // awaitで待っているので処理終了をここで出力 11 Console.WriteLine("処理終了"); 12}
求めているのは2つ以上の同時アクセスなのでawaitで待たずに次のurl取得処理に移行させるためにasync Task<string>ではなくasync voidにすればいいのでしょうが、上記2つのurlに同時アクセスしてどちらもbody取得を完了したかをどのように判断して最後のConsole.WriteLine("処理終了");を出力するにはどのようにすれば良いのでしょうか?
開発環境:Windows10 + VisualStudio2015 C# .NetFrameWork4.6.x
どうぞ宜しくお願いします。
対応アプリケーションの種類はWinFormです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/07/12 10:21
2017/07/12 10:30 編集
退会済みユーザー
2017/07/12 10:40