डिस्पैचर के साथ टाइमर की तुलना करें


98

क्या एक अंतर है between System.Windows.Forms.Timer()और System.Windows.Threading.DispatcherTimer()? किन मामलों में, हमें उनका उपयोग करना चाहिए? कोई सर्वोत्तम प्रथा?

जवाबों:


111

Windows.Forms.Timerटाइमर घटनाओं को संसाधित करने के लिए विंडोज़ रूपों संदेश लूप का उपयोग करता है। इसका उपयोग Windows Forms अनुप्रयोगों में उपयोग किए जा रहे समय घटनाओं को लिखते समय किया जाना चाहिए, और आप चाहते हैं कि टाइमर मुख्य UI थ्रेड पर आग लगा दे।

DispatcherTimerWPF समय तंत्र है। इसका उपयोग तब किया जाना चाहिए जब आप एक समान तरीके से समय को संभालना चाहते हैं (हालांकि यह एक थ्रेड तक सीमित नहीं है - प्रत्येक थ्रेड का अपना डिस्पैचर है) और आप WPF का उपयोग कर रहे हैं। यह डिस्पैचर के रूप में उसी थ्रेड पर ईवेंट को फायर करता है।

सामान्य तौर पर, WPF == DispatcherTimerऔर Windows Forms == Forms.Timer

कहा जा रहा है, वहाँ भी है System.Threading.Timer, जो एक टाइमर है classजो एक अलग धागे पर फायर करता है। यह विशुद्ध रूप से संख्यात्मक समय के लिए अच्छा है, जहां आप UI को अपडेट करने की कोशिश नहीं कर रहे हैं, आदि।


1
अपनी त्वरित प्रतिक्रिया के लिए धन्यवाद। तो इसका मतलब है, जब भी मुझे यूआई से संबंधित टाइमर रखना है, तो मुझे डिस्पैचरटाइमर का उपयोग करना चाहिए, और जब मैं टाइमर को आग लगाना चाहता हूं, जिसे मैं यूएल को फ्रीज नहीं करना चाहता हूं, मुझे अलग से System.Threading.Timer का उपयोग करना चाहिए थ्रेड। दूसरा सवाल यह है: अगर मैं डिस्पैचरटाइमर का उपयोग करना चाहता हूं, और मैं चाहता हूं कि एक टाइमर यूआई के लिए बाध्य न हो, तो क्या मुझे इसे एक अलग थ्रेड में System.Threading.Timer या अभी भी DisptacherTimer का उपयोग करके कॉल करना चाहिए?
१०:१४ पर पैराडिसिनॉर

3
यह इस बात पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं। मैं शायद ही कभी System.Threading.Timer का उपयोग करता हूं - मैं आमतौर पर डिस्पैचर टाइमर से चिपक जाता हूं, और फिर अपने काम को (जो कि आपके यूआई को ब्लॉक कर सकता है) एक बैकग्राउंडर की तरह कुछ का उपयोग करके करते हैं। जब तक आप अपने ईवेंट हैंडलर में "बहुत अधिक" काम नहीं कर रहे, टाइमर को वास्तव में कभी भी आपके UI को ब्लॉक नहीं करना चाहिए।
रीड कोपसे जूल 10'09

मैं समय के साथ प्रोसेसर खाने से डिस्पैचरटाइमर की समस्या हो रही है। क्या इसे संभालने का एक अच्छा तरीका है?
डिस्कोरैक्स

यह देखने के लिए जांचें कि विशेष रूप से सीपीयू क्या खा रहा है। क्या आप बहुत सारी इमारते बना रहे हैं, जिन्हें रोका नहीं जा रहा है?
रीड कोपसी

3
सुनिश्चित करें कि आपने अंतराल गुण को सही तरीके से सेट किया है। ऐसा न करें: टाइमर 1।इंटरवल = नया टाइमस्पैन (1000); // "1000" टिक्सेस का प्रतिनिधित्व करता है मिलीसेकंड नहीं! सीपीयू सुपर हाई था, जब तक कि मैंने इसे इसके साथ ठीक नहीं किया: टाइमर 1।इंटरवल = सिस्टम.टाइमस्पैन।फ्रॉमसेकंड (1);
लोनी बेस्ट

4

मुझे यहाँ छोटे उदाहरणों के साथ टाइमर के बारे में अच्छा लेख मिला है: http://www.progware.org/Blog/post/Timers-in-WPF.aspx

एक निष्कर्ष के रूप में:

यदि DoSomething () GUI घटकों में हेरफेर करता है, तो टाइमर के साथ आपको उपयोग करने की आवश्यकता है: this.Dispatcher.Invoke ((Action) प्रतिनिधि {// GUI संबंधित CODE HERE} चूंकि आप GUI नियंत्रणों को सीधे किसी भिन्न थ्रेड से एक्सेस नहीं कर सकते हैं। डिस्पैचर के साथ आप करते हैं। ऐसा करने की जरूरत नहीं है।

यदि DoSomething () एक समय लेने वाला कार्य करता है, तो डिस्पैचरटाइमर के मामले में GUI फ्रीज हो जाएगा। टाइमर के मामले में यह लंबे समय से एक अलग धागे में निष्पादित किया जाता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.