await是否真的每次释放当前线程?

时间:2017-07-23 21:35:15

标签: c# async-await threadpool

考虑以下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调用时它是否足够智能?

0 个答案:

没有答案