सिस्टम के रूप में। टिमर्स। टिमर और सिस्टम। 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();
}
}
स्रोत
2010-11-25 16:18:46
मुझे लगता है कि सिस्टम.Timers.Timer विस्थापित घटना जैसे ही सिस्टम को बुलाया जाता है। थ्रेडिंग। टिमर विधि का निपटान करें। –
@Ian इस घटना को 'घटक' के अंदर बुलाया जा रहा है। निपटान (निपटान) 'ताकि बेस को कॉल करने से पहले आपको वेटहैंडल सिग्नल प्रदान किया जा सके। डिसस्पेक्ट(), और कस्टम डिस्प्ले (WaitHandle) का उपयोग करें, इसके बाद इसे आग लगनी चाहिए। –