非同期を調査していますが、説明できない次の結果に出くわしました。
次のコード (コピーして Linqpad などに貼り付けることができます) は、スレッド プールから 3 つのスレッドを使用するという驚くべき結果をもたらします。
void Main()
{
Wait();
}
public async void Wait()
{
Print ("Wait() called. Calling GetAnswer()");
var t = await GetAnswerAsync3();
Print("Result of Wait(): " + t);
}
public Task<bool> GetAnswerAsync3()
{
return Task.Run(() => {
// Thread.Sleep(1000);
Print("GetAnswerAsync3() called");
return true;
});
}
public void Print(string message)
{
Console.WriteLine ("Thread: " + Thread.CurrentThread.ManagedThreadId + " - " + message);
}
結果は次のとおりです。
Thread: 35 - Wait() called. Calling GetAnswer()
Thread: 51 - GetAnswerAsync3() called
Thread: 43 - Result of Wait(): True
3 つのスレッドが関係していることを示しています。
今。Thread.Sleep(1000)
Task が返す前にa を追加するとGetAnswerAsync3
、実行中のスレッドは 2 つだけになります。おそらくこれは、スレッドプールがスレッドを再利用するためでしょうか?
ここで 3 つの異なるスレッドが動作しているのはなぜですか?