Co może być wyświetlany jest powszechnie określany jako agility wątku w .NET.
To, co prawdopodobnie widzisz aż do wyników pod etykietą miejscową (tj. Kod aplikacji w System.Web.HttpApplication.BeginRequest()
) jest problemem zręczności wątku; w większości przypadków czas, który tu widzisz, niekoniecznie jest wykonywany, ale kontekst sieciowy czeka na przywrócenie wątków z blokady czytnika-pisarza.
"Przerwa" Application_BeginRequest()
jest bardzo rozpowszechniona w stosie sieci ASP.NET. Generalnie, gdy widzisz długi czas ładowania w BeginRequest, masz do czynienia ze zwinnością wątków ASP.NET i/lub blokadami wątków - szczególnie w przypadku operacji IO i operacji opartych na sesjach. Nie jest to złe, właśnie dlatego .net zapewnia, że wątki pozostaną współbieżne.
Luka czasowa zazwyczaj występuje pomiędzy BeginRequest i PreRequestHandlerExecute. Jeśli aplikacja pisze kilka rzeczy do sesji, ASP.NET wyda blokadę czytnika-pisarza na HttpContext.Current.Session
.
Dobrym sposobem sprawdzenia, czy to jest problem, z którym możesz się spotkać, jest sprawdzenie identyfikatorów wątków w celu sprawdzenia, czy sprawność jest problematyczna - identyfikatory będą różne dla danego żądania.
Na przykład. Podczas debugowania, być może można dodać następujące do Global.asax.cs
:
protected void Application_BeginRequest(Object sender, EventArgs e) {
Debug.WriteLine("BeginRequest_" + Thread.CurrentThread.ManagedThreadId.ToString());
}
Otwórz okno wyjściowe debugowania (z Visual Studio: Zobacz >> wyjścia, a następnie wybierz „Debug” z „wyjście pokazu z” listy rozwijanej) .
Podczas debugowania, naciśnij stronę, na której widzieliście od dawna. Następnie przejrzyj dziennik wyjściowy - jeśli zobaczysz wiele identyfikatorów, możesz na tym cierpieć.
Dlatego czasami może wystąpić opóźnienie, ale nie w innych przypadkach, kod aplikacji może nieco inaczej używać sesji lub sesja lub operacje we-wy mogą być wyższe lub niższe w zależności od strony.
W takim przypadku można zrobić kilka rzeczy, aby przyspieszyć działanie, w zależności od tego, w jaki sposób sesja jest używana na stronie lub na danej stronie.
przypadku stron, które nie modyfikują sesji:
<% @Page EnableSessionState="ReadOnly" %>
przypadku stron, które nie korzystają stanu sesji:
<% @Page EnableSessionState="False" %>
Jeśli aplikacja nie korzysta z sesji (web.config):
<configuration>
<system.web>
<sessionState mode="Off" />
</system.web>
</configuration>
Weźmy następujący przykład:
Użytkownik ładuje stronę, a następnie decyduje się przejść do innej strony przed wykonaniem pierwszego żądania. Załadowanie ASP.NET wymusi blokadę sesji powodującą, że nowe żądanie strony ładuje się do momentu zakończenia żądania pierwszej strony. W ASP.NET MVC każda akcja blokuje sesję użytkownika w celu synchronizacji; powodując ten sam problem.
Cały czas potrzebny do wydania blokady zostanie zgłoszony za pośrednictwem nowej relikwii, nie wspominając o tych, w których użytkownik zrezygnował z sesji, a wątek wracający szuka użytkownika, który już nie istnieje.
Nawiasem mówiąc kontrola UpdatePanel powoduje takie samo zachowanie -
http://msdn.microsoft.com/en-us/magazine/cc163413.aspx
Co można zrobić:
Problem ten zamek jest jednym z powodów, Microsoft ma klasę SessionStateUtility -
http://msdn.microsoft.com/en-us/library/system.web.sessionstate.sessionstateutility.aspx
Aby można było przesłonić domyślne zachowanie r jeśli napotkasz ten problem, jak widać tutaj w tej Realizacja Redis: https://github.com/angieslist/AL-Redis
Istnieje wiele opcji dla domyślnego dostawcy stanu używanego przez witryny oparte na .net. Ale ogólnie wiadomo, że czas transakcji wskazuje, że wątki są blokowane i oczekują na żądania do serwera, które mają być zakończone.
http://blog.stevensanderson.com/blogfiles/2007/ASPNET-MVC-Pipeline/ASP.NET%20MVC%20Pipeline.pdf –
@Ravi BeginRequest() nie jest tam! :( –
Czy używasz jakichkolwiek procedur obsługi asynchronicznych (IHttpAsyncHandler)? –