C# 为什么我的异步方法不将线程返回到线程池?

C# 为什么我的异步方法不将线程返回到线程池?,c#,asp.net,asynchronous,async-await,C#,Asp.net,Asynchronous,Async Await,我正在试验异步/等待模式,并创建了一个简单的ASP.NET API 在Startup.cs中,我将线程数设置为2: ThreadPool.SetMinThreads(2, 2); ThreadPool.SetMaxThreads(2, 2); 我有一个控制器,可以将500000个对象插入内存数据库。此控制器还具有通过GUID查找对象的方法: private void InitialiseDatabase() { _context.Items.Add(new Item {

我正在试验异步/等待模式,并创建了一个简单的ASP.NET API

在Startup.cs中,我将线程数设置为2:

ThreadPool.SetMinThreads(2, 2);
ThreadPool.SetMaxThreads(2, 2);
我有一个控制器,可以将500000个对象插入内存数据库。此控制器还具有通过GUID查找对象的方法:

private void InitialiseDatabase()
{
    _context.Items.Add(new Item {
        Id = Guid.Parse("4ffc6ac9-b2ce-4323-8dc2-5a763ed23f2e") });

    for (int i = 0; i < 500_000; i++)
    {
        _context.Items.Add(new Item { Id = Guid.NewGuid() });
    }

    _context.SaveChanges();
}

[HttpGet("{id}")]
public async Task<ActionResult<Item>> GetItemAsync(Guid id)
{
    var item = await _context.Items.FindAsync(id);

    if (item == null)
    {
        return NotFound();
    }

    return item;
}
private void InitialiseDatabase()
{
_context.Items.Add(新项{
Id=Guid.Parse(“4ffc6ac9-b2ce-4323-8dc2-5a763ed23f2e”);
对于(int i=0;i<500_000;i++)
{
_context.Items.Add(新项{Id=Guid.NewGuid()});
}
_SaveChanges();
}
[HttpGet(“{id}”)]
公共异步任务GetItemAsync(Guid id)
{
var item=wait_context.Items.FindAsync(id);
如果(项==null)
{
返回NotFound();
}
退货项目;
}
为了测试异步的工作方式,我发送了两个对不存在的项目的邮递员请求。每一步都需要大约20秒才能完成。当这些程序运行时,我发送一个对现有项目的请求,这应该需要几秒钟的时间

我的理解是,当命中await关键字时,控制权将让与调用代码,如果这是在控制器级别,那么线程将返回到线程池以供重用

情况似乎并非如此,第三个请求仅在一个长时间运行的请求完成后处理


也许我误解了async在ASP.NET中的工作原理。

试着用一个真正的DB来实现这一点。您的“内存中”DB可能不会通过执行任何实际IO来实现实际的产量控制。或者,您可以使用
wait Task.Delay(1000)模拟IO。并且要明白,控制权不是在第一次等待时就屈服,而是在呼叫链的某个地方屈服。Eric Lippert给出了一个非常好的答案,解释了方法调用不是异步的——你说得对!如果你将此作为答复提交,我将接受。另请参阅。