2008-10-10 41 views
5

का उपयोग करने के लिए मेरे पास VB.Net 2.0 में एक विरासत WinForms एमडीआई ऐप है जिसे मैं कार्यक्षमता जोड़ रहा हूं। जोड़ों में से एक एक चेतावनी है जिसे वर्तमान समय निर्दिष्ट मूल्य (एक समय सीमा) के पास उठाया जाना चाहिए। मेरा इरादा एक घंटे में एक बार समय की जांच करना है जब तक कि समय सीमा तक एक घंटे से भी कम समय न हो, फिर समय के ऊपर निर्दिष्ट अंतराल पर चेतावनियां प्रदर्शित करें।कौन सा नेट टाइमर()

उपयोगकर्ता को समय सीमा के बाद तक और यहां तक ​​कि ऐप का उपयोग जारी रखने में सक्षम होना चाहिए, लेकिन उन्हें समय-समय पर निकटता के बारे में जागरूक होने की आवश्यकता है।

ऐप सिस्टम का उपयोग नहीं करता है। अभी तक पढ़ना और इसके बारे में मेरा ज्ञान इस समय सीमित है। मैं पता है वहाँ 3 अलग टाइमर() उपलब्ध तरीकों हैं कि:

  • System.Threading.Timer(),
  • Windows.Forms.Timer() और
  • System.Timers.Timer()

मेरा सवाल यह है कि, इसके साथ जाने का सबसे अच्छा तरीका कौन सा है? मैंने थ्रेडेड टाइमर का उपयोग करने का प्रयास किया, लेकिन चूंकि WinForms थ्रेड सुरक्षित नहीं हैं, इसलिए मुझे दूसरी कक्षा तक पहुंचने का प्रयास करने में रन टाइम त्रुटि मिली है। क्या वर्ग/फॉर्म थ्रेड को सुरक्षित बनाने के लायक है? क्या मैं पूरी तरह से ट्रैक बंद कर रहा हूँ?

धन्यवाद।

+0

यह पिरोया WinForms प्रोग्रामिंग के लिए, btw संभव है। यदि आपको एक फॉर्म के रूप में एक ही थ्रेड में एक विधि कॉल किया जा रहा है, तो आपको केवल पकड़ने की आवश्यकता है, और यदि नहीं, तो इसे उचित थ्रेड पर प्रेषित करें। यह वास्तव में यह तुलना में कठिन लगता है। –

उत्तर

6

मैं केवल फॉर्म टाइमर का उपयोग करूंगा। मुझे लगता है कि मैंने पढ़ा है कि यह सटीक नहीं है, लेकिन ऐसा लगता है कि आपको इसकी आवश्यकता नहीं है।

+2

फॉर्म टाइमर स्वचालित रूप से फ़ॉर्म पर सिंक्रनाइज़ करता है, जो बोनस –

11

यह लेख बहुत अच्छी तरह से बताते हैं:

Comparing the Timer Classes in the .NET Framework Class Library

ऐसा लगता है System.Windows.Forms.Timer की तरह आप के लिए एक है।

मेरा दिशानिर्देश: यदि आप टाइमर को अपने मुख्य जीयूआई थ्रेड पर चलाने के लिए चाहते हैं, तो Windows.Forms.Timer के साथ चिपके रहें। यदि आपके टाइमर को थ्रेड पूल थ्रेड पर असीमित रूप से कॉल करने के लिए ठीक है, या यदि आप छोटी देरी का अनुभव नहीं करना चाहते हैं तो System.Windows.Forms.Timer को भुगतना पड़ता है, System.Timers.Timer का उपयोग करें। सिस्टम। थ्रेडिंग। टिमर के दूसरे दो से एक अलग इंटरफ़ेस है और थ्रेड-सुरक्षित नहीं है; व्यक्तिगत रूप से, मैं एक प्रशंसक नहीं हूँ।

-1

ठीक है, सबसे पहली बात ...

आप उपयोगकर्ता प्रपत्र दिखाना चाहते हैं और पृष्ठभूमि में कुछ करना अगर मैं BackgroundWorker वर्ग का प्रयोग करेंगे, यह मेरे लिए पहले से काम किया। इसके अलावा, आपको पहले बताए गए तरीकों का आह्वान करने की आवश्यकता है और जैसा कि क्रिस ने कहा था, यह वास्तव में जो भी है उससे कठिन लगता है।

यहां एक लिंक है जो मुझे लगता है कि आपकी मदद करेगा।
http://msdn.microsoft.com/en-us/library/ms171728(VS.80).aspx

+1

-1 के रूप में क्रॉस-थ्रेड नियंत्रण एक्सेस समस्याओं को समाप्त करना चाहिए? मेरे जवाब में क्या गलत है? – sebagomez

0

System.Forms.Timer वास्तव में विंडोज संदेश कतार का उपयोग करके मुख्य धागे पर काम करता है। यह कुछ हद तक अचूक बनाता है लेकिन चूंकि आपको वास्तव में एमएस परिशुद्धता की आवश्यकता नहीं है, यह काफी अच्छा है। आप एक अलग थ्रेड पर काम करने वाले अन्य टाइमर का उपयोग कर सकते हैं, लेकिन चूंकि आपको मुख्य रूप से काम करने वाले Winforms घटक को सक्रिय करने की आवश्यकता है, इसलिए आपको मुख्य थ्रेड में ईवेंट को पास करने के लिए Form.Invoke या किसी अन्य तरीके का उपयोग करने की आवश्यकता होगी। - जो कुछ विलंबता भी पैदा करेगा। निष्कर्ष निकालने में System.Forms.Timer का उपयोग करें जब आपको Winforms आधारित घटक को सक्रिय करने की आवश्यकता होती है।

2

मैं सहमत हूं कि विंडोज़।फॉर्म। टिमर() इस मामले के लिए सबसे अच्छा है क्योंकि यह क्रॉस थ्रेड मार्शलिंग मुद्दों को संभालता है।

कुछ उपयोगी संबंधित लिंक:

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