我正在调查异步,我遇到了以下我无法解释的结果。
下面的代码(可以复制/粘贴到 Linqpad 或类似代码中)对我来说给出了使用线程池中的三个线程的令人惊讶的结果。
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
表明涉及三个线程。
现在。如果我在它返回之前添加一个Thread.Sleep(1000)
返回的任务GetAnswerAsync3
,结果现在只有两个线程在运行!也许这可能是因为线程池重用了一个线程?
为什么这里有三个不同的线程在起作用?