私は過去 2 日間で c# async メソッドについて読んでいましたが、スレッドとは異なり(threadpool.queueuserworkitem())
、async メソッドへの呼び出しはすぐには返されず、呼び出されたメソッドが await または complete(or exception) に達したときにのみ返されます。 )
次の例を参照してください。
public partial class MainWindow : Window
{
// . . .
private async void startButton_Click(object sender, RoutedEventArgs e)
{
// ONE
Task<int> getLengthTask = AccessTheWebAsync();
// FOUR
int contentLength = await getLengthTask;
// SIX
resultsTextBox.Text +=
String.Format("\r\nLength of the downloaded string: {0}.\r\n", contentLength);
}
async Task<int> AccessTheWebAsync()
{
// TWO
HttpClient client = new HttpClient();
Task<string> getStringTask =
client.GetStringAsync("http://msdn.microsoft.com");
// THREE
string urlContents = await getStringTask;
// FIVE
return urlContents.Length;
}
}
私が収集したものから、上記のコードでAccessTheWebAsync()
は、同期的に呼び出されます(つまり、制御が呼び出されてもすぐには戻りません)。ただし、「THREE」という名前の行では、ランタイムが制御を返します。
私の質問は次のとおりです。
ランタイムは、スレッドプールをいつ使用するか、または呼び出し元のスレッドでいつタスクを実行するかをどのように決定しますか? (つまり、制御を戻さずにコードを実行する)
上記のコードのどの時点で、新しいスレッド (またはスレッド プール) が使用されますか?
無数の反復でループを実行するなど、計算集約的な何かを行った場合
AccessTheWebAsync()
、制御はループが完了したときにのみ呼び出し元に戻ります。そうですか?非同期関数では、コントロールをすぐに返し、バックグラウンド スレッドなどで作業を続行する方法はありますか? (threadpool.queueuserworkitem() を呼び出した場合と同様)
await を使用せずに async メソッドを呼び出すことは (可能であると仮定して)、async 以外のメソッドを呼び出すことと同じですか?