यह KB आलेख कहता है कि ASP.NET Response.End()
एक थ्रेड को रोकता है।
रिफ्लेक्टर से पता चलता है कि यह इस तरह दिखता है:
public void End()
{
if (this._context.IsInCancellablePeriod)
{
InternalSecurityPermissions.ControlThread.Assert();
Thread.CurrentThread.Abort(new HttpApplication.CancelModuleException(false));
}
else if (!this._flushing)
{
this.Flush();
this._ended = true;
if (this._context.ApplicationInstance != null)
{
this._context.ApplicationInstance.CompleteRequest();
}
}
}
यह मुझे बहुत कठोर लगता है। जैसा कि KB लेख कहता है, निम्नलिखित एप्लिकेशन में किसी भी कोड को Response.End()
निष्पादित नहीं किया जाएगा, और यह कम से कम विस्मय के सिद्धांत का उल्लंघन करता है। यह लगभग Application.Exit()
एक WinForms ऐप की तरह है। थ्रेड Response.End()
एबॉर्ट अपवाद अपवाद के कारण उपलब्ध नहीं है, इसलिए कोड में आस पास try
... finally
संतुष्ट नहीं करेगा।
यह मुझे आश्चर्यचकित करता है कि क्या मुझे हमेशा बचना चाहिए Response.End()
।
किसी को भी बता सकते हैं, जब मैं का उपयोग करना चाहिए Response.End()
, जब Response.Close()
और जब HttpContext.Current.ApplicationInstance.CompleteRequest()
?
रेफरी: रिक स्ट्राल की ब्लॉग प्रविष्टि ।
मेरे द्वारा प्राप्त इनपुट के आधार पर, मेरा उत्तर है, हां, Response.End
हानिकारक है , लेकिन यह कुछ सीमित मामलों में उपयोगी है।
- असाधारण स्थितियों में
Response.End()
तुरंत समाप्त करने के लिए, एक पहुंच से बाहर फेंकने के रूप में उपयोग करेंHttpResponse
। डिबगिंग के दौरान भी उपयोगी हो सकता है। नियमित प्रतिक्रियाओं को पूरा करने से बचेंResponse.End()
। Response.Close()
क्लाइंट के साथ कनेक्शन को तुरंत बंद करने के लिए उपयोग करें। प्रति इस MSDN ब्लॉग पोस्ट , इस विधि सामान्य HTTP अनुरोध प्रसंस्करण के लिए इरादा नहीं है। यह अत्यधिक संभावना नहीं है कि आपके पास इस पद्धति को कॉल करने का एक अच्छा कारण होगा।CompleteRequest()
एक सामान्य अनुरोध को समाप्त करने के लिए उपयोग करें।CompleteRequest
ASP.NET पाइपलाइनEndRequest
घटना के आगे कूदने का कारण बनता है , वर्तमानHttpApplication
घटना के पूरा होने के बाद । इसलिए यदि आप कॉल करते हैंCompleteRequest
, तो प्रतिक्रिया के लिए कुछ और लिखें, क्लाइंट को लिखित भेजा जाएगा।
संपादन - 13 अप्रैल 2011
आगे स्पष्टता यहाँ उपलब्ध है:
- MSDN ब्लॉग पर उपयोगी पोस्ट
- जॉन रीड द्वारा उपयोगी विश्लेषण
Response.Redirect
और Server.Transfer
दोनों कॉल Response.End
और भी बचा जाना चाहिए।
Response.End
ThreadAbortException
अभी ठीक कर रहा हूं ।