2012-04-16 18 views
14

पर अनुमति देता है मेरे पास एक विजुअल स्टूडियो 2008 सी # .NET 3.5 प्रोजेक्ट है जहां एक वर्ग बहु-प्रसारित किसी अन्य वर्ग से ईवेंट आमंत्रण के लिए सुनता है। मुझे यह सुनिश्चित करने की ज़रूरत है कि मेरा कार्यक्रम केवल अधिकतम 10 धागे तक पहुंच की अनुमति देता है। 11 वें धागे को 10 खत्म होने तक रोकना चाहिए।एक फ़ंक्शन जो केवल एन समवर्ती धागे

myobj.SomeEvent += OnSomeEvent; 

private void OnSomeEvent(object sender, MyEventArgs args) 
{ 
    // allow up to 10 threads simultaneous access. Block the 11th thread. 
    using (SomeThreadLock lock = new SomeThreadLock(10)) 
    {   
     DoUsefulThings(args.foo); 
    } 
} 

मैं अन्य MyObj वर्ग पर नियंत्रण की जरूरत नहीं है, इसलिए मैं वहाँ एक ThreadPool लागू नहीं कर सकते।

इसे लागू करने का सबसे अच्छा तरीका क्या है?

धन्यवाद, PaulH

उत्तर

21

आप Semaphore class चाहते हैं। यह संक्षेप में, एक लॉक है जो किसी भी समय कॉलर की निर्दिष्ट संख्या को अनुमति देता है।

जब से तुम धागे के निर्माण पर नियंत्रण नहीं है, आप गतिरोध स्थितियों के बारे में सावधान रहने की जरूरत नहीं है। सेमफोरस पुनर्वित्त-जागरूक नहीं हैं- यदि एक दिया हुआ धागा एक से अधिक बार एक सेमफोर में प्रवेश करता है, तो इसमें एक से अधिक स्लॉट लगेगा। इसलिए यदि आपके प्रत्येक कॉलर के धागे आपके सेमफोर में एक से अधिक बार प्रवेश करते हैं, तो डेडलॉक की संभावना है।

3

इसके लिए एक सेमफोर का उपयोग करना प्रथागत है। इसे 10 इकाइयों में शुरू करें। DoUsefulThings(), सिग्नल() एक इकाई बाद में एक इकाई के लिए प्रतीक्षा करें()।

9
इस के लिए एक Semaphore

का प्रयोग करें। कन्स्ट्रक्टर पैरामीटर केवल कक्षा में पेश होने वालों के लिए थोड़ा उलझन में हैं। पहला पैरामीटर के माध्यम से के माध्यम से अनुमत धागे की प्रारंभिक संख्या निर्दिष्ट करता है। दूसरा पैरामीटर किसी दिए गए समय के माध्यम से अनुमत धागे की अधिकतम संख्या निर्दिष्ट करता है।

myobj.SomeEvent += OnSomeEvent; 
Semaphore semaphore = new Semaphore(10, 10); 

private void OnSomeEvent(object sender, MyEventArgs args) 
{ 
    semaphore.WaitOne(); 
    try 
    { 
    DoUsefulThings(args.foo); 
    } 
    finally 
    { 
    semaphore.Release(); 
    } 
} 
+1

+1 यह नोट करने के लिए कि आपको कोशिश/पकड़ के 'आखिरकार' ब्लॉक में सेमफोर से बाहर निकलना चाहिए। यह महत्वपूर्ण चीजें हैं- यदि आपका कोड अपवाद फेंकता है, तो आप यह सुनिश्चित करना चाहते हैं कि सेमफोर निकल जाए। –

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