Il est prévu que le temps de réponse soit inférieur au temps total passé dans async-await scénarios d'utilisation. Considérez l’exemple de code suivant pour un point de terminaison Web :
async Task<string> WebEndpointExample()
await DoSomethingForSomeSecondsAsync(5);
[MethodImpl(MethodImplOptions.NoInlining)]
private static async Task DoSomethingForSomeSecondsAsync(int seconds)
await Task.Delay(TimeSpan.FromSeconds(seconds));
Dans cet exemple de code, il faut environ 5 secondes pour que le WebEndpointExample soit terminé, donc le temps de réponse pour la transaction qui représente la demande au point de terminaison WebEndpointExample sera d'environ 5 secondes.
L'agent capture également le temps « occupé » (le temps pendant lequel la méthode instrumentée s'exécute réellement) de chaque segment individuel qui constitue la transaction. Ce sont WebEndpointExample et DoSomethingForSomeSecondsAsync. Idéalement, le temps d’exécution total des deux segments est égal au temps de réponse (environ 5 secondes).
Il est facile de voir que le temps d’exécution de DoSomethingForSomeSecondsAsync est de 5 secondes. Cependant, le temps d’exécution du WebEndpointExample devrait être proche de 0 seconde. (Cela ne fait aucun travail ; c'est DoSomethingForSomeSecondsAsync awaitde terminer.)
Cependant, l'agent mesure toujours son temps d'exécution à environ 5 secondes. Cela est dû à l'incapacité de l'agent à détecter le temps bloqué (pas le temps CPU) lorsqu'une méthode est awaitpour une autre. Le temps total indiqué est donc de 10 secondes, ce qui est supérieur au temps de réponse (environ 5 secondes).
Dans le même temps, l’agent ne peut pas supposer que l’appel aux méthodes async bloquerait toujours l’appelant pendant toute la durée. L'exemple suivant le démontre :
async Task<string> WebEndpointExample()
var task = DoSomethingForSomeSecondsAsync(5);
[MethodImpl(MethodImplOptions.NoInlining)]
private static async Task DoSomethingForSomeSecondsAsync(int seconds)
await Task.Delay(TimeSpan.FromSeconds(seconds));
Dans cet exemple, le temps de réponse est toujours d’environ 5 secondes, mais le temps d’exécution réel du WebEndpointExample n’est plus d’environ 0.