मैं उच्च लोड के तहत एएसपी.नेट (.NET 4) वेब-एप्लिकेशन का परीक्षण कर रहा हूं और पाया है कि कुछ स्थितियों में HttpWebRequest.BeginGetResponse()
किसी भी अपवाद को फेंकने के साथ सिंक्रनाइज़ रूप से w/o पूरा करता है।क्यों HttpWebRequest.BeginGetResponse() समकालिक रूप से पूरा करता है?
उच्च लोड के तहत एकाधिक एएसपी.NET धागे में निम्न कोड चलाने के बाद मुझे "वेबब्रैक पूर्ण सिंक!" मिला है लॉग में संदेश।
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
var result = webRequest.BeginGetResponse(internalCallback, userState);
if (result.CompletedSynchronously)
{
Trace.Error("WEBREQUEST COMPLETED SYNC!");
}
वेतन ध्यान कि:
- मामले में थ्रेड पूल क्षमता एक InvalidOperationException तक पहुँच जाता है फेंक दिया जाता है
- मामले त्रुटि में कनेक्शन इसी अपवाद के दौरान होता है
फेंक दिया जाता है मेरी मामले में कोई अपवाद नहीं है!
मैंने System.Net असेंबली को संकुचित कर दिया है और पाया है कि कुछ स्थितियों में यह वास्तव में संभव है। लेकिन मैं समझ में नहीं आया कि क्या इन शर्तों मतलब (System.Net.Connection.SubmitRequest(HttpWebRequest request, bool forcedsubmit)
):
if (this.m_Free && this.m_WriteDone && !forcedsubmit && (this.m_WriteList.Count == 0 || request.Pipelined && !request.HasEntityBody && (this.m_CanPipeline && this.m_Pipelining) && !this.m_IsPipelinePaused))
{
this.m_Free = false;
needReConnect = this.StartRequest(request, true);
if (needReConnect == TriState.Unspecified)
{
flag = true;
this.PrepareCloseConnectionSocket(ref returnResult);
this.Close(0);
}
}
जब & क्यों संभव है?
[http://ysackoverflow.com/questions/1372053/asynccallback-completedsynchronously) को देखकर प्रतिक्रिया की कैशिंग को रोकने का प्रयास करें, आपको बताएगा कि एसिंक लूप का सामान्य भाग क्या सिंक्रनाइज़ रूप से पूरा होता है आपका कॉलबैक एक ही थ्रेड में है। – Turbot