Se espera que el tiempo de respuesta sea menor que el tiempo total invertido en async
-await
escenarios de uso. Considere el siguiente ejemplo de código para un extremo web:
async Task<string> WebEndpointExample()
await DoSomethingForSomeSecondsAsync(5);
[MethodImpl(MethodImplOptions.NoInlining)]
private static async Task DoSomethingForSomeSecondsAsync(int seconds)
await Task.Delay(TimeSpan.FromSeconds(seconds));
En este ejemplo de código, el WebEndpointExample
tarda aproximadamente 5 segundos en completarse, por lo que el tiempo de respuesta para la transacción que representa la solicitud al extremo WebEndpointExample
será de aproximadamente 5 segundos.
El agente también captura el tiempo "ocupado" (el tiempo que el método instrumentado se está ejecutando realmente) de cada segmento individual que constituye la transacción. Son WebEndpointExample
y DoSomethingForSomeSecondsAsync
. Idealmente, el tiempo total de ejecución de los dos segmentos es igual al tiempo de respuesta (aproximadamente 5 segundos).
Es fácil ver que el tiempo de ejecución de DoSomethingForSomeSecondsAsync
es de 5 segundos. Sin embargo, el tiempo de ejecución de WebEndpointExample
debe ser cercano a 0 segundos. (No hace ningún trabajo; es necesario que await
se complete DoSomethingForSomeSecondsAsync
.)
Sin embargo, el agente todavía mide su tiempo de ejecución en aproximadamente 5 segundos. Esto se debe a la incapacidad del agente para detectar el tiempo bloqueado (no el tiempo de CPU) cuando un método está await
trabajando para otro. Por lo tanto, el tiempo total se informa como 10 segundos, que es mayor que el tiempo de respuesta (aproximadamente 5 segundos).
Al mismo tiempo, el agente no puede asumir que llamar a los métodos async
siempre bloquearía a la persona que llama durante todo el tiempo. El siguiente ejemplo demuestra esto:
async Task<string> WebEndpointExample()
var task = DoSomethingForSomeSecondsAsync(5);
[MethodImpl(MethodImplOptions.NoInlining)]
private static async Task DoSomethingForSomeSecondsAsync(int seconds)
await Task.Delay(TimeSpan.FromSeconds(seconds));
En este ejemplo, el tiempo de respuesta sigue siendo de aproximadamente 5 segundos, pero el tiempo de ejecución real de WebEndpointExample
ya no es aproximadamente 0.