.NET 4.5 async\await フレームワークで遊んだ後、質問があります。
このプログラムを見てみましょう ( msdn の例):
async Task<int> AccessTheWebAsync()
{
HttpClient client = new HttpClient();
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
DoIndependentWork();
string urlContents = await getStringTask;
return urlContents.Length;
}
void DoIndependentWork()
{
resultsTextBox.Text += "Working . . . . . . .\r\n";
}
プログラムは次の順序で実行されます。
- 新しい HttpClient.
- GetStringAsync は同期的に呼び出します。
- ある時点で、GetStringAsync 呼び出しが待機し、コントロールが AccessTheWebAsync に戻ります。
- DoIndependentWork が呼び出されました。
- プログラムは文字列が返されるのを待ちます (操作が完了しなかった場合はブロックします)。
- urlContent の長さを返します。
理解するのに少し時間がかかったのは、メソッドGetStringAsync
がその名前にもかかわらず同期的に実行されることです (名前の規則は本当に誤解を招くものです)。
メソッドを非同期で実行するには、Task.Run
orをTask.Factory.StartNew
明示的に使用する必要があります。
しかし、本当の問題は、独立した作業がある場合、GetStringAsync から await が呼び出されるのを待つのではなく、なぜすぐにそれを実行しないのかということです。(つまり、定義上、非同期メソッドが非同期で実行されないのはなぜですか?)
編集: 2 番目と 3 番目の操作を言い換えます。
(2) GetStringAsync は同期的に開始します。
(3) ある時点で、GetStringAsync 呼び出しが待機し、スレッドが分岐し、制御が AccessTheWebAsync に戻ります。