2008-09-29 97 views
5

मान लीजिए कि मेरे पास एक गैर-पुनरावर्ती घटना है जिसे अब टाइमआउट जैसे एक्स सेकंड उठाए जाने की आवश्यकता है। सहजता से यह सिस्टम बनाने के लिए समझ में आता है। टाइमर। टिमर, एक्स * 1000 में अपना अंतराल सेट करें, इसकी घटना को टिक करें और इसे शुरू करें। चूंकि यह एक आवर्ती घटना है और आप इसे केवल तब उठाना चाहते हैं जब आपको टाइमर को टिकने के बाद रोकना पड़े।.NET टाइमर: एक्स सेकंड में अधिसूचित होने का सबसे अच्छा तरीका क्या है?

तथ्य यह है कि टाइमर स्वाभाविक रूप से पुनरावर्ती हैं हालांकि मुझे यह करने का सबसे अच्छा तरीका है तो मुझे अविश्वसनीय बनाता है। क्या यह समय शुरू करने के लिए बेहतर/अधिक सटीक/सुरक्षित होगा, टाइमर को हर सेकेंड (या यहां तक ​​कि मिलीसेकंद) पर टिकने के लिए सेट करें और समय पर प्रणाली को टिक टिक पर रखें और अपेक्षित समय बीत जाने के बाद ही मैन्युअल रूप से लक्ष्य ईवेंट बढ़ाएं?

क्या कोई भी उस पर वजन कर सकता है जिस पर कोई भी विधि सर्वोत्तम है (शायद एक और विकल्प है जिसे मैंने भी नहीं सोचा था)। क्या एक विधि दूसरे की तुलना में बेहतर हो जाती है यदि मुझे जिस समय की प्रतीक्षा करने की आवश्यकता है उसे मिलीसेकंड में मापा जाता है?

उत्तर

10

सिस्टम के लिए यह constructor.Threading.Timer आपको अवधि निर्दिष्ट करने की अनुमति देता है। यदि आप इस पैरामीटर को -1 पर सेट करते हैं, तो यह आवधिक सिग्नलिंग को अक्षम कर देगा और केवल एक बार निष्पादित करेगा।

public Timer(
    TimerCallback callback, 
    Object state, 
    TimeSpan dueTime, 
    TimeSpan period 
) 
+0

!!! पवित्र बकवास बेन, कभी नहीं जानता था, क्या आपके पास सभी एमएसडीएन याद हैं या कुछ –

+0

या तो यह नहीं पता था। मुझे हमेशा क्यूटी का क्यूटीमर :: सिंगलशॉट आसान लगता है, लेकिन यह जानना अच्छा है कि बीसीएल टाइमर यह कर सकता है :) – OregonGhost

+0

हां, मैंने बिस्तर से पहले हर रात इसे पढ़ा :-) –

5

बस एक सामान्य टाइमर का उपयोग करें और इसे एक बार समाप्त होने के बाद अक्षम करें। जो आपकी समस्या का समाधान करना चाहिए।

दोनों, system.threading.timer और system.timers.timer इसका समर्थन करते हैं।

+0

मैं पहले से ही इस विकल्प mulled है लेकिन मैं विश्वसनीयता के बारे में उत्सुक हूँ और इस तरह के –

2

एक नया पृष्ठभूमि वर्कर, नींद, बंद करें।

var worker = new BackgroundWorker(); 
worker.DoWork += delegate { 
    Thread.Sleep(30000); 
    DoStuff(); 
} 
worker.RunWorkerAsync(); 
+0

एक दिलचस्प समाधान ... –

+0

यह 30000 एमएस के लिए एक प्रोसेसर को घेरता है thats है, है न? –

+0

@Nency - नहीं, मुझे ऐसा नहीं लगता है, पृष्ठभूमि धागा सोना चाहिए और इसलिए किसी भी CPU समय का उपयोग नहीं करना चाहिए। – RickL

0

बस, यह एक्स सेकंड के बाद टिक, और टिक की कोड में सेट करें:

timer.enabled = झूठी;

मेरे लिए काम किया।

0

आप एक सटीक समय को मापने चाहते हैं, आप घड़ी आवृत्ति दोहरीकरण और अपने प्रारंभ समय के साथ तुलना करने DateTime.Now उपयोग करने पर विचार करना चाहिए। टाइमर और थ्रेड। नींद अपने समय माप में जरूरी नहीं है।

1

आप एक सिस्टम टाइमर का उपयोग कर सकते हैं। टाइमर। ऑटोरसेट = सत्य, या एक सिस्टम के साथ। थ्रेडिंग। एक अनंत अवधि (System.Threading.Timeout.Infinite = -1) के साथ एक बार टाइमर निष्पादित करने के लिए।

किसी भी मामले में, जब आप इसके साथ समाप्त कर लेंगे तो आपको अपने टाइमर का निपटान करना चाहिए (यदि टाइमर टिमर के लिए ईवेंट हैंडलर में या थ्रेडिंग टिमर के लिए कॉलबैक में) यदि आपके पास आवर्ती अंतराल नहीं है।

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