2012-02-08 4 views
7

वेबफॉर्म एएसपी.नेट साइट (आईआईएस, एकल ऐप पूल) में एसिंक्रोनस वेब सेवा कॉल के एसिंक्रोनस वेब सेवा कॉल के परिणाम के लिए कैसे प्रतीक्षा करें, मैंने विजुअल स्टूडियो में संदर्भित लंबी वेब सेवा विधि को सेवा संदर्भ के रूप में संदर्भित किया है (.NET 4.0)। दुर्भाग्यवश, मुझे उपयोगकर्ता को पृष्ठ की सेवा करने से पहले वेब सेवा से जानकारी की प्रतीक्षा करनी होगी। वर्तमान में वेब सेवा को सिंक्रनाइज़ कहा जाता है, इसलिए सर्वर अन्य अनुरोधों को संसाधित करने के लिए वर्तमान थ्रेड का पुन: उपयोग नहीं कर सकता है, जिसका प्रदर्शन प्रभाव पड़ता है।सर्वोत्तम प्रदर्शन

बेशक मैं दृश्य स्टूडियो में सेवा में संदर्भ के लिए अतुल्यकालिक संचालन उत्पन्न कर सकते हैं और GetFoo के बजाय BeginGetFoo फोन, लेकिन अभी भी मैं वेब सेवा से परिणाम के लिए किसी भी तरह इंतज़ार करना होगा।

यहां प्रश्न आता है। यदि मैं AsyncWaitHandle.WaitOne (नीचे के रूप में) का उपयोग करता हूं तो क्या यह आज सिंक्रोनस कॉल से पूरे एप्लिकेशन प्रदर्शन शर्तों में बेहतर होगा?

IAsyncResult result = fooSoapClient.BeginGetFoo(); 
result.AsyncWaitHandle.WaitOne(); 
var foo = fooSoapClient.EndGetFoo(result); 

और निश्चित रूप से, यदि प्रतीक्षा बेहतर किया जा सकता है तो मैं सुझावों के लिए खुला हूं।

+0

आप निम्नलिखित दस्तावेज को पढ़ना चाहेंगे: http://msdn.microsoft.com/en-us/library/2e08f6yc(v=vs.100).aspx उस खोजी के लिए आपकी खोज के उत्तर के रूप में। आपने पर्याप्त जानकारी प्रदान नहीं की है –

+0

सर्वोत्तम प्रदर्शन के लिए, प्रतीक्षा न करें, लेकिन निरंतरताएं सेट करें। आपके द्वारा पोस्ट किया गया कोड एक सिंक्रोनस कॉल के समान ही है। – millimoose

+0

@ रामहाउंड - मैंने इसे पढ़ लिया है। आपको कौन सी जानकारी चाहिए, मुझे इसे जोड़ने में खुशी होगी? – Pol

उत्तर

10

आप एक असीमित पृष्ठ का उपयोग करना चाहते हैं। "Wicked Code: Scalable Apps with Asynchronous Programming in ASP.NET", Asynchronous Pages in ASP.NET 2.0 देखें, जो RegisterAsyncTask के साथ वेब सेवाओं और असीमित कार्यों के बारे में बात करता है।

+0

में कताई धागे के बारे में फिल हैक की ब्लॉकपोस्ट वार्ता पर्याप्त रूप से इस उत्तर को ऊपर नहीं उठा सकती है। – Stilgar

+0

मैं 'AddOnPreRenderCompleteAsync() 'witout भारी रिफैक्टरिंग का उपयोग नहीं कर सकता क्योंकि वेब सेवा कॉल कई पृष्ठों में उपयोग किए जाने वाले व्यवसाय तर्क वर्ग में गहरी बैठती है। और 'EndEventHandler' को विभिन्न थ्रेड में निष्पादित किया जा सकता है, जो एक और रिफैक्टरिंग चुनौती है। – Pol

+0

ठीक है आप एसिंक परिचालन को सर्फ किए बिना एसिंक सामग्री नहीं कर सकते हैं। तथ्य यह है कि EndEventHandler को विभिन्न थ्रेड में निष्पादित किया जाना चाहिए, इससे कोई फर्क नहीं पड़ता कि आपका कोड थ्रेडस्टैटिक फ़ील्ड का उपयोग करता है। – Stilgar

0

आप अभी भी थ्रेड को हॉगिंग करेंगे। एएसपी.नेट एमवीसी के एसिंक नियंत्रकों का उपयोग करने के लिए एक "सुरक्षित" विकल्प होगा: http://www.aaronstannard.com/post/2011/01/06/asynchonrous-controllers-ASPNET-mvc.aspx

आदर्श रूप से, आपको वेब अनुरोध पर लंबे समय तक चलने वाली चीजें नहीं करनी चाहिए। एक विंडोज़ सेवा या कुछ चलने वाले कार्य को संसाधित करें (जो एक संदेश कतार पर कुछ छोड़ने या किसी डेटाबेस में कार्य डालने के वेब अनुरोध द्वारा लात मार दिया जा सकता है) और AJAX या किसी चीज़ का उपयोग कर क्लाइंट से मतदान करें और फिर उपयोगकर्ता को अपडेट करें हॊ गया।

+0

मुझे पता है कि मैं इस समस्या से बचने के लिए पूरे डिज़ाइन को बदल सकता हूं, यह कहना आसान है :-) – Pol

+0

क्यों वेब फॉर्म एसिंक व्यवहार प्राप्त करने के लिए एमवीसी को अपने वेब फॉर्म प्रोजेक्ट में जोड़ देगा, जब वेब फॉर्म एसिंक्रोनस पेजों का समर्थन करता है (सेवाएं और हैंडलर) एमवीसी परियोजना शुरू होने से पहले? – Stilgar

+0

एसिंक पेज/हैंडलर एक ही परिणाम प्राप्त करेंगे लेकिन अनुरोध पर इस तरह के लंबे समय तक चलने वाले कार्यों को नहीं किया जाना चाहिए (ऐप पूल रीसायकल इत्यादि)। – ashic

0

यदि आपका कोड रीफैक्टर करना स्वीकार्य नहीं है तो आप @ जॉन सॉंडर्स के उत्तर का पालन नहीं कर सकते हैं, तो केवल एक चीज जो आप कर सकते हैं, आवेदन के लिए धागे की संख्या में वृद्धि है। यह आपको बेहतर स्केल करने की अनुमति देगा लेकिन किसी बिंदु पर इसमें कम रिटर्न होगा और आप प्रदर्शन को चोट पहुंचाना शुरू कर देंगे। यदि आपके पास अनुरोध कतार (यानी आपके सर्वर पर प्रति कोर 25 से अधिक उपयोगकर्ता) पर प्रतीक्षा करने वाले उपयोगकर्ता नहीं हैं तो आपको और कुछ करने की आवश्यकता नहीं है। वेब सर्वर में Async प्रोग्रामिंग केवल स्केलेबिलिटी के साथ मदद करता है लेकिन एक उपयोगकर्ता के लिए वास्तविक प्रदर्शन नहीं करता है।

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