2011-06-04 7 views
7

रद्दीकरण टोकन के साथ सेमफोरस्लिम का उपयोग करते समय मैं कोशिश/अंत में कैसे संरचना करूँगा ताकि ऑपरेशन कैंक्शनल एक्सेप्शन सही ढंग से संभाला जा सके? विकल्प ए में, टोकन स्रोत को रद्द करने से ऑपरेशन कैंक्शनल एक्सेप्शन फेंकता है लेकिन रिलीज़() को कॉल नहीं करता है। विकल्प बी में, टोकन स्रोत को रद्द करने से ऑपरेशन कैंक्शनल एक्सेप्शन फेंकता है और कॉल रिलीज() कॉल करता है।सेमफोरस्लिम। वैट (रद्दीकरण टोकन) ऑपरेशन कैंसेल अपवाद के लिए उचित प्रयास/आखिरकार?

// option A: 
_semaphorSlim.Wait(_cancellationTokenSource.Token); 
try 
{ 
    // do work here 
} 
finally 
{ 
    _semaphorSlim.Release(); 
} 


// option B: 
try 
{ 
    _semaphorSlim.Wait(_cancellationTokenSource.Token); 
    // do work here 
} 
finally 
{ 
    _semaphorSlim.Release(); 
} 

उत्तर

6

विकल्प ए यहां अधिक सही है। जब आप रद्द करते हैं तो आपको ReleaseSemaphoreSlim की आवश्यकता नहीं है, क्योंकि आप वास्तव में कभी भी इसकी गणना नहीं करते हैं और इसकी गणना बढ़ाते हैं। इस प्रकार, आप तब तक रिलीज़ नहीं करना चाहते जब तक कि आपका Wait कॉल वास्तव में सफल नहीं हुआ।

इस MSDN Page on using Semaphore and SemaphoreSlim से:

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

+0

बहुत सराहना की! लिंक के लिए भी धन्यवाद! – SFun28

0

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

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