Async await 在这种情况下,async是否提供了性能改进?(.Net Core 2.1 Web API)

Async await 在这种情况下,async是否提供了性能改进?(.Net Core 2.1 Web API),async-await,asp.net-core-webapi,asp.net-core-2.1,Async Await,Asp.net Core Webapi,Asp.net Core 2.1,我有一个.NETCore2.1WebAPI。我的许多控制器操作都不是异步的,我正在考虑使它们异步。但我想知道,至少在简单的场景中,它是否会有任何性能改进?以一个非常基本的行动为例: // GET: api/People/5 [HttpGet("id")] public Person GetPerson([FromRoute] int id) { return _context.People.FirstOrDefault(p => p.Id == id); } 如果我将其转换为:

我有一个.NETCore2.1WebAPI。我的许多控制器操作都不是异步的,我正在考虑使它们异步。但我想知道,至少在简单的场景中,它是否会有任何性能改进?以一个非常基本的行动为例:

// GET: api/People/5
[HttpGet("id")]
public Person GetPerson([FromRoute] int id)
{
    return _context.People.FirstOrDefault(p => p.Id == id);
}
如果我将其转换为:

// GET: api/People/5
[HttpGet("id")]
public async Task<Person> GetPerson([FromRoute] int id)
{
    return await _context.People.FirstOrDefaultAsync(p => p.Id == id);
}
//GET:api/People/5
[HttpGet(“id”)]
公共异步任务GetPerson([FromRoute]int-id)
{
return wait_context.People.FirstOrDefaultAsync(p=>p.Id==Id);
}
当然,至少在这个非常基本的例子中,这两个动作会在同一时间段内执行吗?我的意思是,即使有两个对非异步操作方法的同时调用,IIS/Kestrel也会承担创建它的第二个实例的任务,以允许两者同时执行?我的意思是,这不像是因为一个客户端调用了这个API端点,现在所有其他客户端都必须等待它完成才能提供服务,因为它不是异步的?

异步对于可能阻塞的活动至关重要, 例如web访问。对web资源的访问有时很慢或很慢 延迟。如果此类活动在同步进程中被阻止,则 整个应用程序必须等待。在异步进程中 应用程序可以继续进行其他不依赖于 web资源,直到潜在的阻止任务完成

使用async/Wait,您可以释放应用程序以管理其他工作

异步对于可能阻塞的活动至关重要, 例如web访问。对web资源的访问有时很慢或很慢 延迟。如果此类活动在同步进程中被阻止,则 整个应用程序必须等待。在异步进程中 应用程序可以继续进行其他不依赖于 web资源,直到潜在的阻止任务完成


使用async/Wait,您可以将应用程序释放出来,用于管理其他工作

async与性能无关,而是与可伸缩性有关。事实上,您实际上是在牺牲原始性能以获得更好的可伸缩性,因为async至少有一定的开销,这将导致每件事情的性能至少略有下降,即使这只是纳秒的问题

异步有一个目的:允许线程在空闲时返回池。然而,无论线程是否处于等待状态,sync都将保持线程。但是,不能保证线程会被释放,甚至不能保证它可以被释放,因为异步方法通常也需要执行同步工作(即CPU绑定),这需要主动使用线程

诚实地说,你看到的真正好处是当你被抨击时。在您的web服务将变得线程匮乏并运行所有同步的场景中,您很可能能够使用async推送更多的请求。影响的程度不仅取决于服务器受到的冲击程度,还取决于所有组成操作受到的冲击程度。以单个
FirstOrDefault
查询为例,在大多数情况下,它可能几乎是瞬时的。但是,如果您的数据库实例遇到一些大型/复杂的查询,或者有太多的查询无法及时处理,那么突然之间,这个简单的过程可能开始比正常情况花费更长的时间。然后可能会开始备份队列中的请求。Async给了您一些喘息的空间

长话短说,使用异步的性能权衡通常是非常小的,在您需要它的时候,它可以成为一个救命稻草。你可以一直等待,先分析,看看是否有问题,然后再返回并使事情异步,但事后返回并将不异步的事情重新调整为异步是一件令人头痛的事情。如果有任何异步工作要做(I/O),那么从一开始就使用异步几乎总是更好的


另外,FWIW,虽然严格来说并不总是这样,尤其是EF Core,实际上没有“同步”访问。非异步方法只是在异步版本上阻塞。所以,真的没有理由不直接使用异步版本。

异步不是性能问题,而是可伸缩性问题。事实上,您实际上是在牺牲原始性能以获得更好的可伸缩性,因为async至少有一定的开销,这将导致每件事情的性能至少略有下降,即使这只是纳秒的问题

异步有一个目的:允许线程在空闲时返回池。然而,无论线程是否处于等待状态,sync都将保持线程。但是,不能保证线程会被释放,甚至不能保证它可以被释放,因为异步方法通常也需要执行同步工作(即CPU绑定),这需要主动使用线程

诚实地说,你看到的真正好处是当你被抨击时。在您的web服务将变得线程匮乏并运行所有同步的场景中,您很可能能够使用async推送更多的请求。影响的程度不仅取决于服务器受到的冲击程度,还取决于所有组成操作受到的冲击程度。以单个
FirstOrDefault
查询为例,在大多数情况下,它可能几乎是瞬时的。但是,如果您的数据库实例遇到一些大型/复杂的查询,或者有太多的查询无法及时处理,那么突然之间,这个简单的过程可能开始比正常情况花费更长的时间。然后可能会开始备份队列中的请求。Async给了您一些喘息的空间

长话短说,使用异步的性能权衡通常是非常小的,在您需要它的时候,它可以成为一个救命稻草。您可以一直等待,分析,先看看是否有问题,然后再返回并使事情异步,但返回并重新启动是一件令人头痛的事情