आप जो देख जा सकता है आमतौर पर .NET में धागा चपलता के रूप में जाना जाता है।
जो आप शायद सामयिक लेबल के नीचे के परिणाम के रूप में देख रहे हैं (यानी System.Web.HttpApplication.BeginRequest()
में आवेदन कोड) एक थ्रेड चपलता समस्या है; ज्यादातर मामलों में जब आप यहां देखते हैं तो कोड को निष्पादित नहीं किया जाता है, लेकिन वेब संदर्भ पाठकों के लिए पाठक-लेखक लॉक से वापस रिलीज़ होने की प्रतीक्षा करता है।
Application_BeginRequest()
"रोकें" एक एएसपी.NET वेब स्टैक में बहुत व्यापक है। सामान्य रूप से जब आप BeginRequest में लंबे समय तक लोड देखते हैं, तो आप एएसपी.NET थ्रेड चपलता और/या थ्रेड लॉक से निपट रहे हैं - खासकर जब आईओ और सत्र आधारित संचालन से निपटते हैं। यह नहीं कि यह एक बुरी बात है, यह सिर्फ यह है कि नेट कैसे सुनिश्चित करता है कि आपके धागे समवर्ती रहते हैं।
टाइम अंतर आमतौर पर BeginRequest और PreRequestHandlerExecute के बीच होता है। यदि एप्लिकेशन सत्र में कई चीजें लिख रहा है तो एएसपी.नेट HttpContext.Current.Session
पर एक पाठक-लेखक लॉक जारी करेगा।
यह देखने का एक अच्छा तरीका है कि यह एक मुद्दा है जिसे आप सामना कर रहे हैं, यह देखने के लिए थ्रेड आईडी जांचना होगा कि चपलता एक मुद्दा है या नहीं - आईडी किसी दिए गए अनुरोध के लिए अलग होंगी।
उदाहरण के लिए। डीबगिंग, शायद आप जोड़ सकते हैं जबकि अपने Global.asax.cs
के लिए निम्न:
protected void Application_BeginRequest(Object sender, EventArgs e) {
Debug.WriteLine("BeginRequest_" + Thread.CurrentThread.ManagedThreadId.ToString());
}
डिबग आउटपुट विंडो खोलें (विजुअल स्टूडियो से: लटकती "से शो उत्पादन" देखें >> आउटपुट से, फिर "डीबग" का चयन करें) ।
डीबगिंग करते समय, उस पृष्ठ पर क्लिक करें जहां आपने लंबे समय से देखा है। फिर आउटपुट लॉग देखें - यदि आप एकाधिक आईडी देखते हैं तो आप इससे पीड़ित हो सकते हैं।
यही कारण है कि आप कभी-कभी देरी देख सकते हैं लेकिन अन्य बार नहीं, एप्लिकेशन कोड थोड़ा अलग तरीके से सत्र का उपयोग कर सकता है या सत्र या आईओ ऑपरेशंस पृष्ठ से पृष्ठ पर उच्च या निम्न हो सकता है।
यदि ऐसा कुछ है तो आप साइट पर या प्रत्येक दिए गए पृष्ठ पर सत्र का उपयोग करने के तरीके के आधार पर चीजों को गति देने में मदद करने के लिए कुछ चीजें कर सकते हैं।
पृष्ठों है कि सत्र को संशोधित नहीं के लिए:
<% @Page EnableSessionState="ReadOnly" %>
पृष्ठों है कि सत्र राज्य का उपयोग नहीं करते के लिए: स्क्रीन के उपयोग नहीं करता है
<% @Page EnableSessionState="False" %>
(web.config):
<configuration>
<system.web>
<sessionState mode="Off" />
</system.web>
</configuration>
तो चलिए निम्नलिखित उदाहरण लें:
उपयोगकर्ता एक पृष्ठ लोड करता है, फिर पहले अनुरोध को लोड करने से पहले किसी अन्य पृष्ठ पर जाने का निर्णय लेता है ASP.NET एक सत्र लॉक को मजबूर करेगा क्योंकि नया पृष्ठ अनुरोध लोड तब तक प्रतीक्षा करेगा जब तक कि पहला पृष्ठ अनुरोध समाप्त न हो जाए। एएसपी.नेट एमवीसी के साथ प्रत्येक एक्शन सिंक्रनाइज़ेशन के लिए उपयोगकर्ता सत्र को लॉक करता है; एक ही मुद्दा पैदा कर रहा है।
लॉक के रिलीज होने के लिए हर बार नए रिलिक के माध्यम से रिपोर्ट की जाएगी, उन लोगों का उल्लेख न करें जहां उपयोगकर्ता ने सत्र छोड़ दिया था और थ्रेड वापस आने वाले उपयोगकर्ता की तलाश में है जो अब मौजूद नहीं है।
संयोग UpdatePanel नियंत्रण समान व्यवहार का कारण बनता है -
http://msdn.microsoft.com/en-us/magazine/cc163413.aspx
क्या किया जा सकता:
यह लॉकिंग समस्या कारणों माइक्रोसॉफ्ट SessionStateUtility वर्ग में से एक है -
http://msdn.microsoft.com/en-us/library/system.web.sessionstate.sessionstateutility.aspx
ताकि आप डिफ़ॉल्ट व्यवहार को ओवरराइड कर सकें अगर आपको इस समस्या का सामना करना पड़ता है जैसा कि इस रेडिस कार्यान्वयन में देखा गया है: https://github.com/angieslist/AL-Redis
.NET आधारित वेबसाइटों द्वारा उपयोग किए जाने वाले डिफ़ॉल्ट राज्य प्रदाता के कई विकल्प हैं। लेकिन आम तौर पर पता है कि यह लेनदेन समय इंगित करता है कि धागे को लॉक किया जा रहा है और सर्वर को पूरा होने के अनुरोधों पर इंतजार कर रहा है।
http://blog.stevensanderson.com/blogfiles/2007/ASPNET-MVC-Pipeline/ASP.NET%20MVC%20Pipeline.pdf –
@Ravi BeginRequest() वहां नहीं है! :( –
क्या आप किसी भी एसिंक हैंडलर (IHttpAsyncHandler) का उपयोग कर रहे हैं? –