2012-03-06 7 views
7

यह MSDN here पर वर्णित सी # .NET में एसिंक्रोनस पैटर्न के बारे में एक सामान्य प्रश्न है।सी # .NET में, एक एसिंक ऑपरेशन आवश्यक रूप से एक धागा बनाता है जो ब्लॉक करता है?

जब एक लंबे चल तुल्यकालिक आपरेशन के नाम से जाना आवश्यक है (उदाहरण के लिए - WCF, डीबी क्वेरी, आईओ, आदि), और मैं धागा ब्लॉक करने के लिए नहीं करना चाहते हैं (उदाहरण के लिए - जीयूआई धागा), मतलब है कि वहां एक और धागा मौजूद होना चाहिए जो अवरुद्ध करता है?

एक तुल्यकालिक कॉल करने का यह अतुल्यकालिक जरूरी ब्लॉक करने के लिए कहीं न कहीं एक धागा की आवश्यकता होती है?

तो, यदि मैं 10 लंबे समय से चलने वाले एसिंक कॉल (जो वास्तव में 10 सिंक्रोनस कॉल हैं) करते हैं, तो वहां प्रतीक्षा करने के लिए 10 धागे होने चाहिए? या 10 धागे को अवरुद्ध होने से रोकने के लिए एक तंत्र है?

डब्ल्यूसीएफ में, आप इसे असीमित बनाने के लिए डब्ल्यूसीएफ कॉल के लिए प्रारंभ और समाप्ति विधियां बना सकते हैं। क्या इसका मतलब यह है कि जब मैं इस एसिंक्रोनस विधि को कॉल करता हूं, तो क्लाइंट या सर्वर पर कहीं भी धागा होता है, जो मेरे लिए इंतजार कर रहा है?

मैंने एसिंक्रनाइटी प्राप्त करने के लिए विभिन्न तरीकों के बारे में कई लेख पढ़े हैं, लेकिन ये लेख हुड के तहत क्या किया जाता है, यह नहीं समझाते हैं।

अद्यतन

मैं अपने प्रश्न अधिक specifc बनाया है, के बाद से मैं के बारे में नेट में रुचि अधिक रहा हूँ। MSDN द्वारा वर्णित एसिंक पैटर्न।

अद्यतन 2

मैं सवाल सुधार तुल्यकालिक कॉल अतुल्यकालिक बनाने के लिए और भी अधिक विशिष्ट होना।

उत्तर

7

.NET फ्रेमवर्क में, एसिंक्रोनस ऑपरेशन को लागू करने के कई तरीके हैं: थ्रेड, थ्रेड पूल, BeginXxx और EndXxx विधियों, ईवेंट आधारित एपीएम, या कार्य आधारित एपीएम का उपयोग करके।

प्रत्येक async पैटर्न अपने स्वयं के आंतरिक कार्यान्वयन है और इन सभी अतुल्यकालिक प्रोग्रामिंग मॉडल इस ब्लॉग article, पारंपरिक BeginXxx और EndXxx async पैटर्न सहित कम से समझाया गया है। Async Summary:

इसके अलावा, जेफरी रिक्टर भी MSDN पत्रिका में CLR Asynchronous Programming Model अच्छी तरह से बताते हैं:

नीचे त्वरित संदर्भ के लिए सभी Async पैटर्न का सारांश है।

+0

महान लिंक की जांच कर सकते अधिक जानकारी के लिए के लिए Async ऑपरेशन के लिए इंतजार कर रहे किसी भी धागा होना नहीं होते। तो यह स्पष्ट रूप से ऐसा नहीं कहता है, लेकिन यह निम्न-स्तर एसिंक कॉल की तरह दिखता है, यह धागे को अवरुद्ध किए बिना किया जाता है। लेकिन अगर आप एक सिंक्रोनस कॉल async बनाना चाहते हैं, तो एक धागा बनाया जाना चाहिए। क्या मैं इस पर सही हूँ? – Mas

+0

@ मास 'थ्रेड' बनाना इसे एसिंक बनाने का एकमात्र तरीका है। संक्षेप में संक्षेप में समझाया गया है, आपके सिंक कॉल को एसिंक कॉल में कनवर्ट करने के अन्य तरीके हैं .. – VS1

+0

तालिका के अनुसार, सभी Async पैटर्न थ्रेड पर आधारित होते हैं (कार्य पृष्ठभूमि में धागे का भी उपयोग करते हैं)। – Mas

2

दुर्भाग्य से, इसका कोई जवाब नहीं है। कुछ पुस्तकालयों ने मूल रूप से कार्यान्वित एसिंक्रोनस ऑपरेशंस प्रदान किए हैं, उदाहरण के लिए सॉकेट्स, जिसमें हार्डवेयर द्वारा समर्थित है। हो सकता है कि अन्य तीसरे पक्ष की लाइब्रेरी की तरह न हो जो बहुत अच्छी तरह से ब्लॉक हो।

3

यह प्रति ऑपरेशन एक थ्रेड आवश्यक नहीं है। @Ioannis Karadimas के रूप में, यह सबसे अधिक संभावना कार्यान्वयन पर निर्भर करता है।

उदाहरण के लिए, कल्पना करें कि मैं एसिंक को 10 अलग-अलग सॉकेट से प्राप्त करना चाहता हूं। इसे एक लूप में चुनने के लिए कॉल का उपयोग करके एक अतिरिक्त थ्रेड के साथ पूरा किया जा सकता है, जो संदेश प्राप्त होने पर गैर-निर्धारित रूप से एक उपलब्ध सॉकेट का चयन करता है।

2

'तो, अगर मैं 10 लंबी दौड़ वाली एसिंक कॉल करता हूं, तो वहां इंतजार करने के लिए 10 धागे होंगे?' सामान्य में, नहीं।

'या 10 धागे को अवरुद्ध होने से रोकने के लिए एक तंत्र है?' - 1 ब्लॉकिंग थ्रेड को एकाधिक वस्तुओं को संसाधित करने की अनुमति देने के लिए तंत्र हैं। सरल उदाहरण - एक कर्नेल थ्रेड एनआईसी सिग्नल और इनपुट कतार सेमफोर पर इंतजार कर सकता है - यह आम तौर पर एक या दूसरे के लिए इंतजार कर रहा है। आपका async उपयोगकर्ता ऐप नेटवर्क भेजता है और कर्नेल थ्रेड इसे कतार से प्राप्त करता है और इसे नेटवर्क कार्ड हार्डवेयर में सबमिट करने का प्रयास करता है। यदि यह नहीं हो सकता है, तो यह इसे एक आंतरिक प्रेषण कतार में जोड़ता है और आपके ऐप पर 'WOULD_BLOCK' उत्तर के साथ वापस आ जाता है। जब हार्डवेयर तैयार होता है, तो यह कर्नेल थ्रेड को सिग्नल करता है, जो आपके प्रेषण बफर को हटा देता है और इसे हार्डवेयर पर लोड करता है।इसी तरह, आपका ऐप एक, या अधिक, recv() async अनुरोधों (बफर के साथ) में भेजता है, और कर्नेल थ्रेड इसे एक सूची में जोड़ता है और 'WOULD_BLOCK' उत्तर के साथ लौटाता है। जब डेटा एनआईसी में आता है, तो उसके चालक संकेत और कर्नेल थ्रेड डेटा का निरीक्षण करता है और उस डेटा की प्रतीक्षा में अपनी प्रविष्टि में प्रवेश ढूंढने का प्रयास करता है। यदि यह आपके ऐप के लिए डेटा है, तो यह हार्डवेयर से डेटा को आपके बफर में कॉपी/डीएमए करता है और आपके एसिंक कॉलबैक को कॉल करता है, (नोट, वास्तव में आपके एएससीएन कॉलबैक को कैसे कॉल किया जाता है, और किस धागे पर ओएस-निर्भर है। शायद एक एपीसी आपके जीयूआई थ्रेड पर कतारबद्ध है, या एक आईओसीपी समापन संरचना उपयोगकर्ता थ्रेड पूल पर कतारबद्ध है)।

वैसे भी, बिंदु यह है कि कर्नेल थ्रेड में इसकी आंतरिक प्रेषण सूची या आरईवी आइटम सूची में कई प्रक्रियाओं से कई प्रविष्टियां हो सकती हैं। जब भी हार्डवेयर, या इसकी इनपुट कतार, ध्यान देने की आवश्यकता होती है, तो यह चलता है और इसे संभालता है, अन्यथा यह अवरुद्ध रहता है।

1

यदि आप फ्रेमवर्क पुस्तकालयों का उपयोग करके एसिंक कॉल करते हैं तो कोई थ्रेड प्रतीक्षा नहीं होगी। उदाहरण के लिए। आपके उपयोग के मामले में आपने का उल्लेख किया है "डब्ल्यूसीएफ में, आप इसे असीमित बनाने के लिए डब्ल्यूसीएफ कॉल के लिए स्टार्ट एंड एंड विधियां बना सकते हैं। क्या इसका मतलब यह है कि जब मैं इस एसिंक्रोनस विधि को कॉल करता हूं, तो क्लाइंट पर कहीं भी धागा होता है या सर्वर, जो मेरे लिए इंतजार कर रहा है? "

वहाँ, पूरा हो आप इस उत्कृष्ट ब्लॉग लेख के लिए http://blog.stephencleary.com/2013/11/there-is-no-thread.html

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