Tengo 2 puntos finales de API que básicamente realizan lo mismo. Carga un elemento de la base de datos utilizando Ef Core y lo devuelve como respuesta. La diferencia es que uno es síncrono y otro es asíncrono, específicamente, la llamada a Ef Core es síncrona en el primer método y asíncrona en el segundo.
Estaba realizando pruebas de carga en ambos terminales con Bombardier. Al principio, uso solo 1 conexión con 5000 solicitudes y el método síncrono funcionó bien. Pensé que el cambio de contexto en el método asincrónico podría ser responsable de esto, ya que solo hay 1 conexión. Luego aumenté las conexiones a 150, pero aún así el método síncrono funciona mucho mejor y tiene mucho más rendimiento que el asíncrono, como puede ver en la imagen a continuación. La primera salida es de versión síncrona y la segunda es de versión asíncrona.
Pensé que habrá más conexión, el método asíncrono brillará, ya que no esperará a la conexión existente y asumirá la otra conexión. ¿Qué hay aquí que no estoy entendiendo? Alguien podría explicarmelo.
ACTUALIZAR
Aquí está mi código y también volví a ejecutar la prueba, incluido su resultado también.
[HttpGet("a")] public IActionResult Get() { var invoices = context.Invoices .Include(it => it.InvoiceItems) .ToList(); return Ok(invoices); } [HttpGet("b")] public async Task<IActionResult> GetAsync() { var invoices = await context.Invoices .Include(it => it.InvoiceItems) .ToListAsync(); return Ok(invoices); }