नाम स्थान थपूल {वर्ग का कार्यक्रम {निजी स्थिर लंबे मान = 0; निजी स्थिर स्ट्रिंग obj = string.Empty; स्थिर शून्य मुख्य (स्ट्रिंग [] एआरजीज़) {थ्रेड ओजथाह्रेड 1 = नया थ्रेड (नया थ्रेडस्टार्ट (वृद्धि मूल्य)); objThread1.Start (); धागा objThread2 = नया थ्रेड (नया थ्रेडस्टार्ट (वृद्धि मूल्य)); objThread2.Start (); objThread1.Join (); objThread2.Join (); कंसोल.प्रकाश लाइन ("वैल =" + वैल + "हालांकि यह" + (10000000 + 10000000) होना चाहिए); Console.ReadLine (); } प्राइवेट स्टैटिक void IncrementValue () {for (int i = 0; i & lt; 10000000; i ++) {मॉनिटर। एंटर (obj); वैल ++; Monitor.Exit (obj); }}}}
मैं थ्रेड के प्रतिस्थापन में थ्रेडपूल
वर्ग का उपयोग कैसे करूं? मॉनिटर?
थ्रेड पूल का उपयोग करने के कुछ तरीके हैं आपके कार्य के लिए, आपको निम्नलिखित पर विचार करना चाहिए।
- यदि आपको बस सबसे आसान तरीका चलाने के लिए एक कार्य की आवश्यकता है तो
QueueUserWorkItem
का उपयोग करना है, जो केवल एक प्रतिनिधि को ले जाता है चलाते हैं। यह नुकसान यह है कि आपके पास नौकरी पर बहुत कम नियंत्रण है प्रतिनिधि कोई मान नहीं लौटा सकता है, और आप यह नहीं जानते कि रन कब पूरा हो गया है। - यदि आप थोड़ा अधिक नियंत्रण चाहते हैं, तो आप
BeginInvoke
/EndInvoke
प्रतिनिधियों का इंटरफ़ेस का उपयोग कर सकते हैं। यह थ्रेड पूल थ्रेड पर चलाने के लिए कोड को निर्धारित करता है आपIAsyncResult
संकेतन के माध्यम सेBeginInvoke
द्वारा वापस प्राप्त कर सकते हैं, और आपEndInvoke <के द्वारा परिणाम (साथ ही कार्यकर्ता धागा पर कोई अपवाद) प्राप्त कर सकते हैं < / code>।
ठीक से, हालांकि, अगर आपको एन्टर करें
/ पर बाहर निकलें
का उपयोग करने के लिए, आपको यह सुनिश्चित करना होगा कि बाहर निकलें
हमेशा कहा जाता है इसलिए आपको अपना बाहर निकलें कॉल अंत में ब्लॉक में रखना चाहिए।
एन्टर
के लिए समयबाह्य मान प्रदान करने की आवश्यकता नहीं है, तो आप केवल lock
कीवर्ड का उपयोग करके बेहतर होगा, जो Enter
और Exit
कॉल का उचित सेट में संकलित करता है
Comments
Post a Comment