2008-10-01 14 views

उत्तर

15

घटनाओं का उपयोग करें जब आपके पास कोई थ्रेड हो जो किसी एक या कुछ घटनाओं को करने के लिए इंतजार कर रहा हो।

मॉनीटर का उपयोग करें यदि आप डेटा संरचना तक पहुंच प्रतिबंधित करना चाहते हैं तो सीमित कर सकते हैं कि कितने थ्रेड इसे एक्सेस कर सकते हैं।

मॉनीटर आमतौर पर संसाधन की रक्षा करते हैं, जबकि ईवेंट आपको कुछ बंद होने की सूचना देते हैं, जैसे एप्लिकेशन बंद हो रहा है।

इसके अलावा, ईवेंट का नाम दिया जा सकता है (OpenExisting विधि देखें), इससे उन्हें विभिन्न प्रक्रियाओं में सिंक्रनाइज़ेशन के लिए उपयोग करने की अनुमति मिलती है।

2

इस ट्यूटोरियल क्या आप को पता है की आवश्यकता होगी के विवरण विस्तृत हो गया है: http://www.albahari.com/threading/

विशेष रूप से, इस XXXResetEvent वर्गों को कवर किया जाएगा,
http://www.albahari.com/threading/part2.aspx

और इस को कवर किया जाएगा प्रतीक्षा/पल्स: http://www.albahari.com/threading/part4.aspx#_Wait_and_Pulse

+0

यूआरएल के लिए धन्यवाद। यह बहुत उपयोगी था। –

9

मेरी राय में, मॉनिटर का उपयोग करना बेहतर है यदि आप कर सकते हैं, मॉनिटर। प्रतीक्षा करें और मॉनीटर.पल्स/पल्सएल का उपयोग धागे के बीच सिग्नलिंग के लिए किया जाता है (जैसे मैनुअल/ऑटो रीसेट इवेंट हैं) हालांकि मॉनिटर तेज है, और मूल सिस्टम संसाधन का उपयोग नहीं करता है। इसके अलावा स्पष्ट रूप से मॉनिटर को उपयोगकर्ता मोड में कार्यान्वित किया जाता है और प्रबंधित किया जाता है, जबकि मैन्युअल/ऑटो रीसेट एवेन्ट्स को कर्नेल मोड में स्विच करने की आवश्यकता होती है और पी/देशी Win32 कॉलों को आमंत्रित करने की आवश्यकता होती है जो प्रतीक्षा हैंडल का उपयोग करते हैं।

ऐसी स्थितियां हैं जहां आपको मैन्युअल/ऑटोरसेट इवेंट का उपयोग करने की आवश्यकता होगी, उदाहरण के लिए, उन प्रक्रियाओं के बीच सिग्नल करने के लिए जिन्हें आप नामित घटनाओं का उपयोग कर सकते हैं, और मुझे लगता है कि आपके ऐप में मूल धागे को सिग्नल करना है।

मैं केवल this excellent article में थ्रेडिंग के बारे में जो कुछ पढ़ता हूं उसे पुनर्जन्म दे रहा हूं।

पूरा लेख पढ़ने योग्य है, हालांकि लिंक आपको प्रतीक्षा हैंडल सेक्शन पर ले जाता है जो घटनाओं का विवरण देता है और प्रतीक्षा/नाड़ी की निगरानी करता है।

6

आप एक WaitHandle का उपयोग जब आप एक धागा चाहते भेज सकते हैं या के बिना एक महत्वपूर्ण अनुभाग के लिए की जरूरत एक बाइनरी संकेत प्राप्त करने के लिए होगा। Monitor.Wait और Monitor.Pulse दूसरी ओर को एक महत्वपूर्ण अनुभाग की आवश्यकता है। बीसीएल में अधिकांश सिंक्रनाइज़ेशन तंत्र की तरह कुछ उल्लिखित है कि आपके द्वारा उल्लिखित दो का उपयोग कैसे किया जा सकता है। लेकिन, एक पल के लिए मत सोचो कि वे एक ही उद्देश्य को पूरा करते हैं।

Monitor.Wait और Monitor.Pulse एमआरई या एआरई की तुलना में बहुत अधिक प्राचीन सिंक्रनाइज़ेशन तंत्र हैं। वास्तव में, आप वास्तव में Monitor कक्षा से अधिक कुछ भी नहीं कर सकते हैं, एमआरई या एआरई बना सकते हैं। समझने की सबसे महत्वपूर्ण अवधारणा यह है कि Monitor.Wait और WaitHandle.WaitOne विधियां अलग-अलग हैं। Wait और WaitOne दोनों धागे को WaitSleepJoin स्थिति में डाल देंगे जिसका अर्थ है कि धागा निष्क्रिय हो जाता है और केवल Thread.Interrupt या संबंधित Pulse या Set कॉल का जवाब देता है। लेकिन, और यह एक बड़ा अंतर है, Wait एक महत्वपूर्ण खंड छोड़ देगा और इसे परमाणु तरीके से में पुनः प्राप्त करेगा।WaitOne बस यह नहीं कर सकता। यह एक अंतर है जो इन सिंक्रनाइज़ेशन तंत्रों के व्यवहार के लिए मौलिक है जो उन परिदृश्यों को परिभाषित करता है जिनमें उनका उपयोग किया जा सकता है।

ज्यादातर स्थितियों में आप एक एमआरई या एआरई चुनते हैं। ये ज्यादातर स्थितियों को संतुष्ट करते हैं जहां एक थ्रेड को दूसरे से सिग्नल प्राप्त करने की आवश्यकता होती है। हालांकि, अगर आप अपना खुद का सिग्नलिंग तंत्र बनाना चाहते हैं तो आपको Wait और Pulse का उपयोग करना होगा। लेकिन, फिर से, .NET बीसीएल में पहले से ही सबसे लोकप्रिय सिग्नलिंग तंत्र शामिल हैं। निम्नलिखित सिग्नलिंग तंत्र पहले से मौजूद हैं ।

  • ManualResetEvent (या ManualResetEventSlim)
  • AutoResetEvent
  • सेमाफोर (या SemaphoreSlim)
  • EventWaitHandle
  • CountdownEvent
  • बैरियर

एक सम्मानजनक उल्लेख BlockingCollection कक्षा में जाता है। यह प्रति सिग्नलिंग तंत्र नहीं है, लेकिन इसमें अतिरिक्त लाभ के साथ सिग्नलिंग तंत्र के गुण हैं जो आप सिग्नल को डेटा संलग्न कर सकते हैं। इस मामले में सिग्नल का मतलब है कि संग्रह में कोई आइटम उपलब्ध है और उस सिग्नल से जुड़े डेटा आइटम ही हैं।

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