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 awaitse 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á awaittrabajando 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.