2010-03-08 19 views
6

मैं इंटर थ्रेड संचार के लिए ऑटो रीसेट इवेंट हैंडल का उपयोग करने की योजना बना रहा हूं।.NET थ्रेड सिंक्रनाइज़ेशन

EventWaitHandle handle = new EventWaitHandle(false, EventResetMode.AutoReset); 

मेरे निर्माता की तरह

produceSomething(); 
handle.Set(); 

उपभोक्ता धागा में नीचे, मैं हर एक मिनट या जब निर्माता सेट विधि कहा जाता है

try 
{ 
    while(true) 
    { 
     handle.WaitOne(60000, false); 
     doSomething(); // Downloads data from Internet. 
         // Takes lot of time to complete it. 
    } 
} 
catch(ThreadAbortException) 
{ 
    cleanup(); 
} 

के लिए डेटा डाउनलोड करने के लिए धागा कोड नज़र मेरा सवाल यह है कि यदि उपभोक्ता धागा doSomething फ़ंक्शन और निर्माता कॉल फ़ंक्शन चला रहा है, तो ऑटो रीसेट ईवेंट ऑब्जेक्ट की स्थिति क्या होगी?

मेरी आवश्यकता है जैसे ही निर्माता सेट सेट विधि मुझे इंटरनेट से ताजा डेटा डाउनलोड करना होगा। यदि doSomething फ़ंक्शन चल रहा है, जब निर्माता सेट विधि सेट करता है, तो मुझे इसे बाधित करना होगा और फिर से कॉल करना होगा।

उत्तर

2

एक ऑटो-रीसेट ईवेंट एक गेट की तरह है जो पहले धागे के माध्यम से बंद हो जाता है। यदि आप इसे सेट करते हैं तो एक या अधिक धागे इंतजार कर रहे हैं तो एक थ्रेड उठता है, फिर ईवेंट रीसेट हो जाता है, शेष थ्रेड प्रतीक्षा करते रहते हैं।

आप सेट करते हैं जब कोई धागे इंतजार कर रहे हैं, तो पहले धागा कि handle.WaitOne कॉल के लिए इंतजार नहीं होगा, लेकिन यह घटना रीसेट होना होगा और फिर पर जारी कारण होगा।

http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx

कॉलिंग वेटिंग धागा जारी करने की तैयारी का संकेत AutoResetEvent से

। AutoResetEvent एक एकल प्रतीक्षा थ्रेड जारी होने तक संकेतित रहता है, और उसके बाद स्वचालित रूप से गैर-संकेतित स्थिति पर वापस आ जाता है। यदि कोई धागे इंतजार नहीं कर रहा है, तो राज्य अनिश्चित काल तक संकेतित रहता है।

यदि कोई थ्रेड प्रतीक्षा करता है तो AutoResetEvent संकेतित स्थिति में होता है, तो थ्रेड ब्लॉक नहीं होता है। AutoResetEvent तुरंत थ्रेड जारी करता है और गैर-संकेतित स्थिति पर लौटाता है।

1

आपके परिदृश्य में ऑटो-रीसेट ईवेंट के साथ समस्या यह है कि "सेटिंग" यह क्यूइंग का समर्थन नहीं करती है।

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

अपने मामले में, यदि आप उपभोग करने की तुलना में तेज़ दर पर उत्पादन कर रहे हैं तो ऑटो-रीसेट ईवेंट मिस्लीडिंग हो सकता है। इस मामले की कल्पना करो।

  • निर्माता एक आइटम का उत्पादन करता है।
  • उपभोक्ता आइटम का उपभोग करता है (ईवेंट को रीसेट करता है और इनसेट से डाउनलोड करना शुरू करता है)
  • निर्माता दूसरे आइटम का उत्पादन करता है।
  • निर्माता एक तीसरी वस्तु का उत्पादन करता है।
  • उपज बंद हो जाती है।
  • उपभोक्ता दूसरे आइटम का उपभोग करता है (घटना को दोबारा शुरू करता है और फिर से डाउनलोड करना शुरू करता है)
  • उपभोक्ता तीसरे आइटम को फिर से नहीं ठहराएगा क्योंकि ऑटोरेसेट ईवेंट रीसेट कर दिया गया है।
संबंधित मुद्दे