2012-09-05 9 views
5

मैं उच्च लोड के तहत एएसपी.नेट (.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!"); 
} 

वेतन ध्यान कि:

  1. मामले में थ्रेड पूल क्षमता एक InvalidOperationException तक पहुँच जाता है फेंक दिया जाता है
  2. मामले त्रुटि में कनेक्शन इसी अपवाद के दौरान होता है

फेंक दिया जाता है मेरी मामले में कोई अपवाद नहीं है!

मैंने 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); 
    } 
} 

जब & क्यों संभव है?

+0

[http://ysackoverflow.com/questions/1372053/asynccallback-completedsynchronously) को देखकर प्रतिक्रिया की कैशिंग को रोकने का प्रयास करें, आपको बताएगा कि एसिंक लूप का सामान्य भाग क्या सिंक्रनाइज़ रूप से पूरा होता है आपका कॉलबैक एक ही थ्रेड में है। – Turbot

उत्तर

4

अगर अतुल्यकालिक आपरेशन तुल्यकालिक पूरा निर्धारित करने के लिए CompletedSynchronously propperty
इस संपत्ति का उपयोग करने के लिए इस पाया। उदाहरण के लिए, यदि I/O अनुरोध छोटा था तो यह संपत्ति एक एसिंक्रोनस I/O ऑपरेशन के लिए सच हो सकती है।
HERE

संपादित करें: - मैं संदेह है कि प्रतिक्रिया को कैश्ड हो रही हो सकता है। इसलिए request.CachePolicy = new HttpRequestCachePolicy(/*caching type*/);

+0

क्यों एक डाउन वोट? –

+0

उपयोगी, लेकिन कोई जवाब नहीं +1 –

+0

@exacerbatedexpert +1 लेकिन मैं वास्तव में संभव होने पर डिकंपील्ड कोड या आलेख w/विवरण के संदर्भ की अपेक्षा करता हूं। "छोटा" मानदंड नहीं है। –

2

तरह से मैं यह समझता हूँ कि async तरीकों 3 परिदृश्यों में तुल्यकालिक पूरा हो गया है:

आपरेशन बहुत जल्दी पूरा किया जा सकता है - और इसलिए एक अतुल्यकालिक संचालन के प्रबंधन के लिए भूमि के ऊपर से बचने के लिए तुल्यकालिक मार डाला गया था।

अंतर्निहित कार्यान्वयन - या ऑपरेटिंग सिस्टम - उस परिदृश्य में असीमित प्रोग्रामिंग मॉडल (एपीएम) का समर्थन नहीं करता है।

ऑपरेशन सीपीयू-बाउंड था और इसे अवरुद्ध किए बिना पूरा किया जा सकता था।

(संक्षेप में सी # से लिया गया कारण J.Albahari & बी। अलबाहारी)।

+0

धन्यवाद। लेकिन मुझे विशेष रूप से HttpWebRequst या कोड के लिंक के लिए अधिक जानकारी चाहिए। –

संबंधित मुद्दे