次のコードを実行すると、HttpClient.GetAsync()
呼び出しが完了してから結果が返される前にメッセージ"Press Enter to continue... "
が表示されます。実際のイベントシーケンス:GetAsync()
コールが行われ、 "Press Enter...
"というメッセージが表示され、結果がコンソールウィンドウに1つずつ出力されます。 「Press Enter...
」メッセージを表示する前に、すべてのGetAsync()
コールが完了するまでどのように待つのですか? DownloadPageAsync
以来すべてのタスクが完了するまで非同期コードを待機させる方法を教えてください。
class Program
{
static HttpClient client = new HttpClient();
static void Main(string[] args)
{
RunAsync().Wait();
Console.WriteLine("\n\n\n\nPress Enter to continue... ");
Console.ReadLine();
}
static async Task RunAsync()
{
List<string> urls = new List<string>()
{
"http://www.domain1.com",
"http://www.domain2.com",
"http://www.domain3.com",
"http://www.domain4.com"
};
foreach (var url in urls)
{
DownloadPageAsync(url);
}
}
static async Task<string> DownloadPageAsync(string url)
{
Console.WriteLine("Starting: " + url);
HttpResponseMessage response = await client.GetAsync(url);
if (response.IsSuccessStatusCode)
{
// do stuff here
}
Console.WriteLine("Done: " + url);
return response.Content.ToString();
}
}
「Task.WhenAll(urls.Select(DownloadPageAsync))」に単純化できるメカニズムはありますか?私はそのフォーマットに遭遇したのは初めてです。 –
'Select'は' Func 'を呼び出します。これは' DownloadPageAsync'が起こります。 –
'RunAsync'から' async'キーワードを削除し、 'Task.WhenAll(...) 'を返すようにしてください。 – AndyPook