एक अंतर यह है कि सिस्टम। थ्रेडिंग। टिमर हर बार एक नया धागा बनाने के बजाय थ्रेड पूल थ्रेड पर कॉलबैक भेजता है। यदि आपको अपने आवेदन के जीवन के दौरान एक से अधिक बार होने की आवश्यकता है, तो यह धागे का एक गुच्छा बनाने और नष्ट करने के ऊपरी हिस्से को बचाएगा (एक प्रक्रिया जो बहुत संसाधन गहन है, जैसा कि आप संदर्भित करते हैं लेख के रूप में), क्योंकि यह होगा बस पूल में धागे का पुन: उपयोग करें, और यदि आपके पास एक से अधिक टाइमर एक बार चलते हैं तो इसका मतलब है कि आपके पास कम से कम थ्रेड चलेंगे (काफी संसाधनों को भी बचाएंगे)।
दूसरे शब्दों में, टाइमर अधिक कुशल होने वाला है। यह भी अधिक सटीक हो सकता है, क्योंकि थ्रेड। स्लीप केवल तब तक प्रतीक्षा करने की गारंटी देता है जब तक आप निर्दिष्ट समय की मात्रा (ओएस इसे अधिक समय तक सो सकता है)। अनुमोदित, टाइमर अभी भी सटीक नहीं होने वाला है, लेकिन इरादा कॉलबैक को जितना संभव हो सके निर्दिष्ट समय के करीब आग लगाना है, जबकि यह आवश्यक रूप से थ्रेड का इरादा नहीं है। सो जाओ।
टाइमर को नष्ट करने के लिए, कॉलबैक पैरामीटर स्वीकार कर सकता है, इसलिए आप टाइमर को पैरामीटर के रूप में पास कर सकते हैं और कॉलबैक में कॉल का निपटान कर सकते हैं (हालांकि मैंने यह कोशिश नहीं की है - मुझे लगता है कि यह है संभव है कि कॉलर के दौरान टाइमर लॉक हो सकता है)।
संपादित करें: नहीं, मुझे लगता है कि आप ऐसा नहीं कर सकते हैं, क्योंकि आपको टाइमर कन्स्ट्रक्टर में कॉलबैक पैरामीटर निर्दिष्ट करना होगा।
शायद ऐसा कुछ हो सकता है? (फिर से, वास्तव में यह कोशिश की है नहीं)
class TimerState
{
public Timer Timer;
}
... और टाइमर शुरू करने के लिए:
TimerState state = new TimerState();
lock (state)
{
state.Timer = new Timer((callbackState) => {
action();
lock (callbackState) { callbackState.Timer.Dispose(); }
}, state, millisecond, -1);
}
ताला टाइमर टाइमर से पहले मुक्त करने की कोशिश कर से टाइमर कॉलबैक रोकने चाहिए क्षेत्र सेट किया गया है।
परिशिष्ट: के रूप में टिप्पणीकार ने कहा, यदि कार्रवाई() यूआई के साथ कुछ करता है, तो एक System.Windows.Forms.Timer का उपयोग कर शायद एक बेहतर शर्त, है, क्योंकि यह यूआई पर कॉलबैक चलेंगे धागा। हालांकि, अगर यह मामला नहीं है, और यह थ्रेड पर है। नींद बनाम थ्रेडिंग। टिमर, थ्रेडिंग। टिमर जाने का रास्ता है।
यह System.Windows.Forms.Timer के साथ अंतर को इंगित करने के लायक भी है, जो मैं * विश्वास करता हूं * यूआई थ्रेड पर एक फ़ंक्शन कॉल करता है, जो WinForms ऐप्स के लिए वास्तव में महत्वपूर्ण है! –
भावी पाठकों के लिए, 'स्लीप' घटना कम से कम होने की गारंटी नहीं है, यह दस्तावेज है कि यह कम हो सकता है। –
जिज्ञासा से बाहर ... यह कहां दस्तावेज है? –