2011-04-13 13 views
6

मेरे पास एक बहु थ्रेडेड एप्लिकेशन है और CancellationToken साझा ऑब्जेक्ट के रूप में उपयोग किया जाता है। प्रत्येक थ्रेड इसे अन्य धागे को बताने के लिए ट्रिगर कर सकता है कि नौकरी रद्द कर दी गई है। फिर एक धागा साफ-सफाई करता है और इस ऑब्जेक्ट को इस CancellationToken जैसा डिस्पोजेक्ट करता है। फिर यदि कोई धागा इसका उपयोग करने का प्रयास करता है, तो एक अपवाद उठाया जाता है:किसी ऑब्जेक्ट को कैसे पता लगाया गया है?

रद्दीकरण टोकनसोर्स का निपटारा किया गया है।

इसका उपयोग करने से पहले किसी ऑब्जेक्ट का निपटारा कैसे किया जा सकता है?

+2

क्यों एक थ्रेड उपयोग में संसाधनों की सफाई कर रहा है अभी भी?यह मेरे लिए एक बड़ी डिजाइन दोष की तरह लगता है। –

+0

'रद्दीकरण टोकन' सिंक्रनाइज़ेशन के लिए उपयोग किया जाता है। ऐसा होता है कि दो धागे एक ही समय में नौकरी रद्द करने का प्रयास करते हैं। शायद इससे अधिक ताला मदद करता है? – Xaqron

+0

कृपया अपने प्रश्न बीटीडब्ल्यू को ठीक करें, आप 'रद्दीकरण टोकन' का निपटारा नहीं कर रहे हैं, जो नहीं किया जा सकता है। आप 'रद्दीकरण टोकन स्रोत' का डुबकी कर रहे हैं। –

उत्तर

4

ठीक है, प्रतिबिंबक के अनुसार, CancellationTokenSource में एक आंतरिक IsDisposed विधि है जो आपको बता सकती है, लेकिन चूंकि यह आंतरिक है, इसलिए आपको इसे कॉल नहीं करना है।

किसी भी मामले में, यदि एक धागा डेटा संरचनाओं और वस्तुओं को अन्य धागे पर निर्भर करता है, तो ऐसा न करें। अपने कोड को ठीक करें और उन वस्तुओं को उनकी ज़रूरत की अवधि के लिए छोड़ दें।

दूसरे शब्दों में, उन अन्य थ्रेडों को प्रतीक्षा करने के लिए CancellationTokenSource की आवश्यकता समाप्त करने से पहले प्रतीक्षा करें।

1

जांचें कि इसका उपयोग करने से पहले ऑब्जेक्ट का निपटारा किया गया है या नहीं।

अभी भी सबसे अच्छा डिजाइन पैटर्न नहीं है। हालांकि यहां मैं जो उपयोग करता हूं वह यह निर्धारित करता है कि कोई वस्तु का निपटारा किया गया है या नहीं।

if (!object.IsDisposed) object.DoSomething(); 

या

public string DoSomething() 
{ 
    if (this.IsDisposed) return null; 
} 

है कि अगर काम नहीं करता है, तो आप एक IsDisposed ध्वज जोड़ने और निपटाने विधि अधिरोहण करने का प्रयास कर सकते हैं। और इसे अपने कोड में सही करने के लिए सेट करें।

2

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

आम तौर पर, एक अच्छी तरह से डिज़ाइन किए गए ऑब्जेक्ट के बाहर कोड को यह पूछने की आवश्यकता नहीं है कि इसे डिस्पोजेड किया गया है, सिवाय इसके कि यह संभवतः यह कहने के लिए कि यह किया गया है। इसके बजाए, ऑब्जेक्ट को स्वयं विधियों को प्रदान करना चाहिए जिनके अर्थ एक डिस्पोजेड ऑब्जेक्ट पर स्पष्ट और स्पष्ट होगा। वे विधियां आंतरिक रूप से एक IsDisposed ध्वज का उपयोग कर सकती हैं, लेकिन दौड़ की स्थिति को रोकने के लिए जो कुछ भी लॉकिंग आवश्यक था उसका उपयोग करना होगा। सामान्य तौर पर, पैटर्न

 
    if (!myThing.isDisposed) 
    myThing.DoSomething(); 

एक संकेत है कि myThing वास्तव में एक DoSomethingIfNotDisposed विधि (संभवतः TryDoSomething कहा जाता है) का समर्थन करना चाहिए है। यदि आप ऐसा नहीं कर सकते हैं, तो मेरा झुकाव आपके स्वयं के DoSomethingIfNotDisposed एक्सटेंशन विधि को लिखना और ऑब्जेक्टडिस्प्लेक्स अपवाद (या वस्तु जो भी विशेष अपवाद फेंक देगा) को दबाने के लिए प्रयास/कैच का उपयोग करना हो सकता है।

+0

मेरे पास एक है लेकिन समस्या दौड़ की स्थिति है। शायद एक प्रतीक्षा संभाल समस्या को हल करता है। – Xaqron

+0

@Xaqron: यदि कक्षा ठीक तरह से डिज़ाइन की गई थी, तो इसकी रद्द विधि बस कुछ भी नहीं करें अगर इसे पहले से ही निपटाया गया है (यदि यह हमेशा कुछ ऐसा करने से बच नहीं सकता जो अपवाद का कारण बनता है, तो इसे अपवाद को अपने आप में दबाना चाहिए)। – supercat

0

अपनी कक्षा के उत्तराधिकार और संपत्ति जोड़ें:

class MyCancellationTokenSource: CancellationTokenSource 
{ 
    public bool MyIsDisposed { get; private set; } 
    protected override void Dispose(bool disposing) 
    { 
     base.Dispose(disposing); 
     MyIsDisposed = true; 
    } 
} 
संबंधित मुद्दे

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