2010-11-25 12 views
9

जब आप "कच्चे" .NET टाइमर का निपटान करते हैं, तो Win32 टाइमर नष्ट हो जाने के बाद आप एक प्रतीक्षा हैंडल में जा सकते हैं और आप उन्हें मान सकते हैं कि आपकी कॉल बैक नहीं कहा जाएगा। (और टाइमर को जीसी द्वारा "मृत" माना जाएगा)मैं सुरक्षित रूप से सिस्टम को कैसे निपट सकता हूं। टिमर्स। टिमर?

मैं इसे सिस्टम.इमर.इमर के साथ कैसे कर सकता हूं?

उत्तर

0

सिस्टम के रूप में। टिमर्स। टिमर और सिस्टम। Windows.Forms.Timer दोनों थ्रेडपूल का उपयोग करते हैं, इसमें ऑपरेटिंग सिस्टम टाइमर के लिए कोई संभाल नहीं है, इसलिए कोई देशी टाइमर संसाधन नहीं है जिसका निपटारा किया गया है - बस एक पूर्ण धागा । मुझे यकीन नहीं है कि आप थ्रेडपूल द्वारा रीसाइक्लिंग किए जा रहे थ्रेड को कैप्चर कर सकते हैं लेकिन मैं गलत हो सकता हूं।

आप शायद रोल कर सकता है अपने स्वयं के (मैं इस परीक्षण किया है नहीं, और निपटान में एक ManualResetEvent लेने अधिक उपयोगी हो सकता है):

void Run() 
{ 
    ManualResetEvent resetEvent = new ManualResetEvent(false); 

    System.Threading.Timer timer = new System.Threading.Timer(delegate { Console.WriteLine("Tick"); }); 
    timer.Dispose(resetEvent); 

    MyTimer t = new MyTimer(); 
    t.Interval = 1000; 
    t.Elapsed += delegate { t.Dispose(resetEvent); }; 

    resetEvent.WaitOne(); 
} 


public class MyTimer : System.Timers.Timer 
{ 
    protected override void Dispose(bool disposing) 
    { 
     base.Dispose(disposing); 
    } 

    public virtual void Dispose(WaitHandle handle) 
    { 
     handle.SafeWaitHandle.Close(); 
     Dispose(); 
    } 
} 
+0

मुझे लगता है कि सिस्टम.Timers.Timer विस्थापित घटना जैसे ही सिस्टम को बुलाया जाता है। थ्रेडिंग। टिमर विधि का निपटान करें। –

+0

@Ian इस घटना को 'घटक' के अंदर बुलाया जा रहा है। निपटान (निपटान) 'ताकि बेस को कॉल करने से पहले आपको वेटहैंडल सिग्नल प्रदान किया जा सके। डिसस्पेक्ट(), और कस्टम डिस्प्ले (WaitHandle) का उपयोग करें, इसके बाद इसे आग लगनी चाहिए। –

3

एक ध्वज सेट करें इससे पहले कि आप निपटान कहते हैं, और में इस ध्वज की जाँच आपका विलुप्त हैंडलर। भले ही टाइमर आग लगती है, ध्वज किसी भी संबंधित हैंडलर कोड को चलाने से रोक देगा। आप टाइमर के लिए एक रैपर लिखकर इस पैटर्न को औपचारिक रूप से कार्यान्वित कर सकते हैं।

सुनिश्चित करें कि आपका ध्वज अस्थिर के रूप में चिह्नित है क्योंकि इसे विभिन्न धागे से एक्सेस किया जाएगा।

+0

अस्थिर पर्याप्त नहीं है, एमआरई या इंटरलाक्ड का उपयोग करें। –

+0

@ हंस अगर अस्थिर ध्वज निपटाने से पहले सेट किया गया है, तो एक टाइमर थ्रेड इसे देखेगा यदि बाद में समाप्त होने वाली घटना होती है। आप यहां क्या समस्या देख रहे हैं? –

+0

थ्रेड के लिए दस्तावेज़ों की जांच करें। मेमरीबैरियर –

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