Ce que vous pouvez voir est communément appelé fil d'agilité .NET.
Ce que vous êtes probablement en voyant autant que les résultats en dessous de la topique de l'étiquette (c'est à dire le code de l'Application (dans le Système.Web.HttpApplication.BeginRequest()) est un fil d'agilité problème; dans la plupart des cas, le temps que vous voyez ici n'est pas nécessairement l'exécution d'un code, mais le contexte web d'attente pour les threads pour être libérée à partir d'un lecteur-écrivain de verrouillage.
Le Application_BeginRequest "pause" en est un qui est assez répandue dans un ASP .NET web de la pile. En général, quand vous voyez à long temps de chargement dans BeginRequest, vous avez affaire à ASP.NET fil agilité et / ou le thread verrouillage des portes - en particulier lorsque vous traitez avec IO et de la session. Non pas que c'est une mauvaise chose, c'est juste comment .net permet de s'assurer de votre threads restent simultanées.
L'intervalle de temps se produit généralement entre BeginRequest et PreRequestHandlerExecute. Si la demande est écrit à plusieurs choses à la session, puis ASP .NET sera question d'un lecteur-verrou en écriture sur HttpContext.Actuel.Session.
Une bonne façon de voir si c'est une question que vous pourriez être confronté à vérifier l'Id de thread pour voir si l'agilité est un problème - l'Id sera différent pour une requête donnée.
Par exemple. pendant le débogage, vous pourriez peut-être ajouter les éléments suivants à votre global.asax.cs:
protected void Application_BeginRequest(Object sender, EventArgs e) {
Debug.WriteLine("BeginRequest_" + Thread.CurrentThread.ManagedThreadId.ToString());
}
Ouvrir la fenêtre de sortie de débogage (à Partir de Visual Studio: Affichage >> de Sortie, puis sélectionnez "Debug" dans le "spectacle de la sortie de" liste déroulante).
Pendant le débogage, appuyez sur une page où vous avez vu le temps long. Puis afficher le fichier journal de sortie - si vous voyez plusieurs id alors vous pourriez souffrir de cette situation.
C'est pourquoi vous pouvez constater que le retard, parfois, mais pas d'autres fois, le code de l'application peut-être à l'aide de session un peu différemment ou d'une session ou d'opérations d'e / s peuvent être supérieures ou inférieures de la page à page.
Si c'est le cas de certaines choses que vous pouvez faire pour aider à accélérer les choses en fonction de la façon dont la session est utilisé sur le site ou à chaque page.
Pour les pages qui ne modifient pas de session:
<% @Page EnableSessionState="ReadOnly" %>
Pour les pages qui n'utilisent pas l'état de la session:
<% @Page EnableSessionState="False" %>
Si l'application n'utilise pas de session (le web.config):
<configuration>
<system.web>
<sessionState mode="Off" />
</system.web>
</configuration>
Prenons l'exemple suivant:
L'utilisateur charge une page, puis décide d'aller à une autre page avant de la première demande est fait, le chargement d'ASP .NET force une session de verrouillage provoquant la nouvelle page de demande de chargement d'attendre jusqu'à ce que la première page de demande de finitions. Avec l'ASP .NET MVC chaque action permet de verrouiller la session de l'utilisateur pour la synchronisation; à l'origine du même problème.
Tout le temps il a fallu pour que le verrou de presse seront signalés par le biais des nouvelles relique, sans parler de ceux où l'utilisateur abandonné la session et le fil de retour est à la recherche pour un utilisateur qui n'existe plus.
D'ailleurs le contrôle UpdatePanel fait le même comportement -
http://msdn.microsoft.com/en-us/magazine/cc163413.aspx
Ce qui peut être fait:
Ce problème de verrouillage est l'une des raisons de Microsoft a la SessionStateUtility classe
http://msdn.microsoft.com/en-us/library/system.web.sessionstate.sessionstateutility.aspx
De sorte que vous pouvez remplacer le comportement par défaut si vous faites face à ce problème, comme on le voit ici, dans cette
Redis mise en œuvre:https://github.com/angieslist/AL-Redis
Il existe de nombreuses options à l'état par défaut du fournisseur utilisé par .net sites web. Mais sais généralement ce temps de transaction indique que les threads sont verrouillées et l'attente des requêtes au serveur pour être complété.