2011-10-19 7 views
12

मैं एक म्युटेक्स उपयोग करने के लिए एक से अधिक थ्रेड से कुछ हार्डवेयर के लिए उपयोग की रक्षा के लिए कोशिश कर रहा हूँ, लेकिन मैं क्या exitContext पैरामीटर का मतलब/के रूप में उलझन में हूँ करता है:वेटहैंडल के लिए बाहर निकलने का संदर्भ क्या है। व्हाटऑन का मतलब है?

public virtual bool WaitOne (
    int millisecondsTimeout, 
    bool exitContext 
) 

The docs कहते हैं:

exitContext - सत्य प्रतीक्षा से पहले संदर्भ के लिए सिंक्रनाइज़ेशन डोमेन से बाहर निकलने के लिए (यदि सिंक्रनाइज़ किए गए संदर्भ में), और इसे बाद में पुनः प्राप्त करें; अन्यथा, झूठी

... लेकिन इसका वास्तव में क्या अर्थ है और इसे सही या गलत पर सेट करने के क्या परिणाम हैं? मैंने इसे अभी सत्य के लिए सेट कर दिया है और कोड काम करने लगता है, लेकिन मुझे परेशान है कि मैं पूरी तरह समझ नहीं पा रहा हूं कि यह हुड के नीचे क्या है!

उत्तर

5

यह भी बताते हैं कि further down the page under Remarks:

नोट्स जब तक WaitOne विधि एक nondefault कामयाब संदर्भ अंदर से कहा जाता है पर संदर्भ से बाहर निकल रहा

exitContext पैरामीटर कोई प्रभाव नहीं है। यह तब हो सकता है जब आपका थ्रेड ContextBoundObject से व्युत्पन्न कक्षा के उदाहरण के लिए कॉल के अंदर है। भले ही आप वर्तमान में कक्षा पर एक विधि निष्पादित कर रहे हैं जो स्ट्रिंग की तरह ContextBoundObject से प्राप्त नहीं होता है, तो आप एक nondefault संदर्भ में हो सकते हैं यदि कोई ContextBoundObject वर्तमान 0 डोमेन में आपके स्टैक पर है।

जब आपके कोड एक nondefault संदर्भ में निष्पादित हो रहा है, exitContext के लिए निर्दिष्ट करने के सच बाहर निकलने के लिए nondefault कामयाब संदर्भ (जो है, डिफ़ॉल्ट संदर्भ में संक्रमण के लिए) WaitOne विधि निष्पादित करने से पहले धागे का कारण बनता है। WaitOne विधि को कॉल करने के बाद थ्रेड मूल nondefault संदर्भ पर लौटता है।

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

14

एमएसडीएन पृष्ठ का टिप्पणी अनुभाग निश्चित रूप से पूरी तरह से gobbledegook की तरह पढ़ता है। निष्पादन संदर्भ .NET में एक छिपी हुई कार्यान्वयन जानकारी हैं। मैं आपको बता दूंगा कि मैंने पूरी तरह से इसे कम करने में सक्षम होने के बिना इंजीनियर को उलट दिया।

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

इस विधि के पीछे एक ओर कहानी कि यह इतना बुरा समझा जाता है कि Microsoft .NET 2. वे सर्विस पैक 2 में WaitOne (int) अधिभार कौन सा exitContext के लिए झूठी गुजरता जोड़ा में पश्चगामी संगतता को तोड़ने का फैसला किया है तर्क। इससे बहुत सारे तबाही हुए, प्रोग्रामर ने इसका उपयोग करना शुरू कर दिया, फिर .NET के प्री-एसपी 2 संस्करण पर चलने पर उनके प्रोग्राम को असफल पाया। आउच।

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