उपयोगकर्ता पेज spawn.aspx जो फिर एक आधे दर्जन धागे spawns, पृष्ठों प्रतिपादन सभीका उपयोग करते हुए एक HttpContext धागे भर में
((System.Web.IHttpHandler)instance).ProcessRequest(reference to spawn's HTTPContext);
का उपयोग कर तथ्य यह है कि ASP.Net प्रतीत होता है उपयोगकर्ता भेज रहा है के बारे में चिंता मत करो हिट 1 अनुरोध के लिए 7 प्रतिक्रियाएं, उस भाग को संभाला जाता है और केवल एक प्रतिक्रिया भेजी जाती है।
System.IndexOutOfRangeException at System.collections.ArrayList.Add at System.Web.ResponseDependencyList.AddDependencies(String[] items, String argname, Boolean cloneArray, DateTime utcDepTime) at System.Web.ResponseDependencyList.AddDependencies(String[] items, String argname, Boolean cloneArray, String requestVritualPath) at System.Web.UI.Page.AddWrappedFileDependencies(Object virtualFileDependencies) at ASP.spawned_page_no_1_aspx.FrameworkInitialize() at System.Web.UI.Page.ProcessRequest
हम इसे कहीं और नकल नहीं कर सकते हैं:
समस्या है, एक उच्च यातायात पर्यावरण (हमारी उत्पादन पर्यावरण) कई धागे (क्वाड-quads) के साथ में हम कोई त्रुटि मिलती है। मेरा सहकर्मी मानता है कि ऐसा इसलिए है क्योंकि मैं मूल HTTPContext का पुन: उपयोग कर रहा हूं और इसे अन्य धागे में गुजर रहा हूं, और यह थ्रेड-सेफ नहीं है।
इस तर्क के बाद, मैंने धागे में जाने के लिए एक नया HTTPContext बनाने का प्रयास किया है। लेकिन इसके कुछ हिस्सों में "गठबंधन" नहीं होगा। विशेष रूप से, मुझे सत्र ऑब्जेक्ट को नए HTTPContext में प्राप्त करने की आवश्यकता है। मुझे कल्पना है कि मैं कैश की तरह, अन्य भागों को भी प्राप्त करना चाहता हूं। रिकॉर्ड HTTPContext.Current.Session.IsSynchronized के लिए गलत है।
मेरे प्रश्न हैं:
- क्या आपको लगता है त्रुटि धागे भर में HttpContext का उपयोग करने से है?
- मैं इसे कैसे ठीक कर सकता हूं?
- यदि फिक्स प्रत्येक थ्रेड के लिए HTTPContext को डुप्लिकेट कर रहा है, तो मैं सत्र (और कैश) को नए में कैसे प्राप्त कर सकता हूं? अनुरोध और प्रतिक्रिया सीटीआर में आती है, लेकिन सत्र सेटटेबल नहीं है।
संपादित करें: अधिक जानकारी
तो वापस इस बयान के लिए जा रहा: "तथ्य यह है कि ASP.Net प्रतीत होता है 1 अनुरोध के लिए उपयोगकर्ता भेज रहा है 7 प्रतिक्रियाओं के बारे में चिंता मत करो, वह हिस्सा नियंत्रित किया जाता है और केवल एक प्रतिक्रिया भेजी जाती है। " रेमंड चेन के विशाल प्रशंसक, मैं आपसे सहमत हूं: "अब आपके पास दो समस्याएं हैं" किसी और जानकारी की अनुपस्थिति में एक उचित बयान है।
वास्तव में क्या हो रहा है कि मैं वापस भेजने के लिए एक एक्सेल दस्तावेज़ बना रहा हूं। Spawn.aspx पृष्ठ में यह कुछ राज्य जानकारी स्थापित कर रहा है, जिसमें तथ्य यह है कि यह एक्सेल करने के लिए प्रतिपादन कर रहा है, और ऑब्जेक्ट को प्रतिपादन करने के लिए। प्रत्येक स्पॉन्टेड पेज उस जानकारी को प्राप्त करता है, और जब तक ऑब्जेक्ट को प्रस्तुत करने की बारी न हो जाए तब तक अवरुद्ध हो जाएगा। सचमुच इस तरह दिखाई देता है:
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
if (this.RenderToExcel)
{
Deadlocker.SpinUntilCurrent(DeadLockToken);
RenderReport(this, this.XLSWriter);
Deadlocker.Remove(DeadLockToken);
}
else
base.Render(writer);
}
लेकिन ऊपर है कि बात करने के लिए सभी संसाधन - डेटाबेस का उपयोग, नियंत्रण पदानुक्रम, सभी कि समानांतर में किया है। और इसमें बहुत कुछ है - पर्याप्त है कि इसे रेंडर पर अवरुद्ध करने के दौरान इसे फिर से खराब करने से कुल मिलाकर आधे से अधिक समय में कटौती होगी।
और इसका सबसे अच्छा हिस्सा यह है कि एक्सेल रेंडर के लिए कुछ भी लिखना नहीं था। सभी नियंत्रणों को पता है कि कैसे उत्कृष्टता प्राप्त करने के लिए खुद को प्रस्तुत करना है, और आप स्वतंत्र रूप से प्रत्येक स्पैन किए गए पृष्ठ पर जा सकते हैं (वास्तव में यह 'सामान्य मामला' है - एक्सेल रिपोर्ट केवल सभी तैयार पृष्ठों का एकत्रीकरण है।)
तो मैंने सोचा अंतिम परिणाम "आप ऐसा नहीं कर सकते हैं, आपको दृष्टिकोण पर पुनर्विचार करने की आवश्यकता है" - लेकिन मुझे कम से कम प्रयास करना पड़ा, क्योंकि तथ्य यह है कि सबकुछ किसी भी तर्क या किसी भी कोड को डुप्लिकेट किए बिना या कुछ भी अमूर्त किए बिना इतना अच्छी तरह से काम करता है बस इतना सही है। और यह केवल बहु-थ्रेडिंग है जो समस्या है, अगर मैं पृष्ठों को क्रमशः प्रस्तुत करता हूं तो सब कुछ ठीक है, बस धीमा।
अल इस लॉकिंग को व्यवस्थित करना मुश्किल होगा, वह जो थ्रेडिंग अपवाद प्राप्त कर रहा है वह पृष्ठ क्लास से है, जो http संदर्भ को म्यूट कर रहा है, जब तक कि वह ऐसा करने वाले पेज में कार्रवाई को ओवरराइड नहीं कर सकता, और फिर लॉक रखता है लॉकिंग समाधान काम नहीं करेगा। – meandmycode
ग्रेट टिप्पणी, मैं आपसे सहमत हूं। मेरी प्राथमिकता एक पूरी तरह से नई वस्तु को पारित करना होगा जो चलती रचना के समय HTTP संदर्भ से इसकी कुछ जानकारी प्राप्त करता है। वह बुलेट सबूत होगा। –