देखने पर Monitor.Wait
और Monitor.Pulse
/PulseAll
प्रणाली दे के साधन के रूप (Wait
के लिए) प्रतीक्षा करने का एक साधन उपलब्ध कराने, बल्कि के रूप में नहीं है उचित तरीके से जानते हैं कि कोड वेटिंग पाश में है जो बाहर निकलने नहीं कर सकते ब्याज में कुछ बदलाव होने तक, और (Pulse
/PulseAll
के लिए) सिस्टम को यह बताने के साधन के रूप में कि कोड ने कुछ ऐसा बदल दिया है जो निकास की स्थिति को किसी अन्य थ्रेड के प्रतीक्षा लूप को संतुष्ट कर सकता है। Wait
की सभी घटनाओं को Sleep(0)
के साथ प्रतिस्थापित करने में सक्षम होना चाहिए और अभी भी कोड काम सही ढंग से हो सकता है (भले ही सीपीयू समय को बार-बार परीक्षण करने वाली स्थितियों का परीक्षण करने के परिणामस्वरूप बहुत कम कुशलतापूर्वक हो)।
प्रतीक्षा पाश में कोड हालत का परीक्षण करती है जब यह संतुष्ट नहीं है:
इस तंत्र काम करने के लिए, यह निम्न क्रम की संभावना से बचने के लिए आवश्यक है।
अन्य धागे में कोड स्थिति को बदलता है ताकि यह संतुष्ट हो।
उस अन्य धागे में कोड लॉक को दाल करता है (जो कि अभी तक कोई भी इंतजार नहीं कर रहा है)।
प्रतीक्षा लूप में कोड Wait
करता है क्योंकि इसकी स्थिति संतुष्ट नहीं थी।
Wait
विधि की आवश्यकता है कि प्रतीक्षा धागा के बाद कि एक ही रास्ता यह सुनिश्चित करें कि हालत इस पर इंतजार कर रहा है समय यह परीक्षण किया है और बार कोड प्रदर्शन के बीच में परिवर्तन नहीं होगा हो सकता है, लॉक Wait
। Pulse
विधि को लॉक की आवश्यकता होती है क्योंकि यह एकमात्र तरीका है कि यह सुनिश्चित हो सकता है कि यदि कोई अन्य धागा Wait
करने के लिए स्वयं "प्रतिबद्ध" है, तो Pulse
अन्य धागे वास्तव में ऐसा करने के बाद तक नहीं होगा। ध्यान दें कि लॉक के भीतर Wait
का उपयोग करने से यह गारंटी नहीं मिलती है कि इसका सही उपयोग किया जा रहा है, लेकिन लॉक के बाहर Wait
का उपयोग करने का कोई तरीका नहीं है कि संभवतः सही हो सकता है।
Wait
/Pulse
डिज़ाइन वास्तव में दोनों पक्षों द्वारा सहयोग करने के लिए उचित रूप से अच्छी तरह से काम करता है। डिजाइन की सबसे बड़ी कमजोरियों, आईएमएचओ, (1) धागे के लिए इंतजार करने के लिए कोई तंत्र नहीं है जब तक कि कई वस्तुओं में से कोई भी स्पंदित न हो; (2) भले ही कोई ऑब्जेक्ट "शट डाउन" कर रहा हो, भले ही सभी भावी प्रतीक्षा लूप तुरंत बाहर निकलें (शायद बाहर निकलने के झंडे की जांच करके), यह सुनिश्चित करने का एकमात्र तरीका है कि कोई भी Wait
जिस पर थ्रेड स्वयं ही प्रतिबद्ध है, उसे Pulse
मिलेगा लॉक हासिल करना है, संभवतः इसके लिए उपलब्ध होने के लिए अनिश्चित काल तक प्रतीक्षा करना है।
आप इसे क्यों पसंद करते हैं? मॉनिटर के लिए उपयोग किए गए लॉकर ऑब्जेक्ट पर बस एक लॉक मॉनिटर को कैसे सिंक्रनाइज़ करेगा? लॉक नहीं करते एक और संदर्भ स्विचिंग जो ResetEvents की आवश्यकता नहीं है? – user437631
@ user437631: हां, बस एक सामान्य 'लॉक' कथन ठीक है। उसमें अतिरिक्त संदर्भ स्विच की आवश्यकता हो सकती है या नहीं - और मुझे नहीं लगता कि आपके पास कोई सबूत है कि ResetEvents को इसकी आवश्यकता नहीं होगी। वास्तव में, क्योंकि वे संभावित रूप से क्रॉस-प्रोसेस Win32 ऑब्जेक्ट्स की बजाय सीएलआर-आंतरिक ऑब्जेक्ट्स हैं, मॉनीटर रीसेट एवेन्ट्स की तुलना में लाइटर-प्रतीक्षा हैं। –