考虑以下async / await C#代码示例 -
public async Task<int> A()
{
// 1
int id = await B();
// 6
return id;
}
public async Task<int> B()
{
// 2
int id = await C();
// 5
return id;
}
public async Task<int> C()
{
// 3
var id = await Task.Delay(1000); // db.GetCustomerId();
// 4
return id;
}
让我们考虑延迟模拟db.GetCustomerId()作为一些将返回id的db调用。 假设我在注释1到6中打印ManagedThreadId; 我在位置1,2,3获得相同的线程ID,并且在4,5,6处获得不同但相同的线程ID。 当在A()中遇到await时,如果调用尚未完成,则当前线程将返回ThreadPool,并且新线程将在B()处继续。但我认为同样的线索还在继续。 当我运行一个循环1000以使用Thread.Factory.StartNew()在程序中使用CPU密集型方法运行A()的事件我没有看到任何区别。
所以我的问题是等待实际上每次都将当前线程返回到池中,还是只有在对网络进行i / o调用时它是否足够智能?