c# - 为什么异步方法比 .NET Core 3.1 中的同步版本更快?

标签 c# asp.net-core async-await

在工作中,我们讨论是否应该在 20 个用户的 ASP.NET Core 应用程序中使用同步快速查询(例如 EF 的 dbContext.Table.First())而不是异步版本,因为额外的时间来为异步操作创建另一个线程。

我对这两个版本进行了基准测试。

该应用程序在 Windows 10 计算机(i5、16 Gb、当前计时器间隔:0.999 毫秒)上运行。数据库位于本地网络中 Docker 中的另一台计算机上。

public async Task<DailyExchangeRate> GetExchangeRateAsync(int currencyId, DateTime date)
{
    return await dbContext.DailyExchangeRates
            .Where(dr => dr.CurrencyId == currencyId)
            .FirstOrDefaultAsync(dr => dr.Date == date.Date);
}

public DailyExchangeRate GetExchangeRate(int currencyId, DateTime date)
{
    return dbContext.DailyExchangeRates
            .Where(dr => dr.CurrencyId == currencyId)
            .FirstOrDefault(dr => dr.Date == date.Date);
}

结果在 Stopwatch.Ticks(最后一列)中: The results in ticks

为什么异步版本更快?

最佳答案

instead of the async versions due to additional time to create another thread for the async operation

为什么您认为对于每个异步操作都必须创建一个新线程?

已经有一个与服务器关联的线程池,这只是“解除阻塞”的问题,可以说给定线程,并使用它来处理另一个请求,因为对数据库的调用是异步的 - 没有必要阻塞直到 SQL 查询完成并返回。

当涉及到数据库的连接时,有一个由 EF 处理的数据库连接池,使用 FirstOrDefaultAsync 也会稍微提高性能,因为它可能会使用相同的连接来处理几个db 调用,而不是使用一个连接并等待来自 db 的结果 - 在 FirstOrDefault 同步调用中

关于c# - 为什么异步方法比 .NET Core 3.1 中的同步版本更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61970114/

相关文章:

c# - 带有 IdentityServer4 的 Blazor(服务器端)

javascript - 从 JS 对象文字中的异步函数初始化的字段 : will they break concurrency?

javascript - 构造函数中的异步函数

c# - Mono:Windows 的 HeapShot GUI 在哪里?

c# - Core 2.1 拒绝响应 Access-Control-Expose-Headers : *

c# - 在 C++ 中创建原始文本字符串,类似于 C#'s "@string"

c# - 在哪里可以记录 ASP.NET Core 应用程序的启动/停止/错误事件?

ASP.NET MVC 4 异步数据库调用 : never returns the HTTP response

c# - 如何使用 Ninject Conventions Extension 进行绑定(bind)?

c# - 使用 fluentvalidation 和 asp.net mvc LessThanOrEqualTo 不触发的不显眼的客户端验证