Thursday 15 March 2012

c# - Timer is not working in cross threads -


मेरे पास 2 वैश्विक System.Windows.Forms.Timer मेरे form । दोनों प्रपत्र के कन्स्ट्रक्टर में आरंभ किए जाते हैं। लेकिन अभी तक शुरू नहीं हुआ निर्माता एक नया धागा प्रारंभ करता है और वह थ्रेड सक्षम और टाइमर दोनों शुरू करता है जाहिर है यह सभी क्रॉस थ्रेडिंग है, लेकिन यह किसी क्रॉस-थ्रेड अपवाद को नहीं फेंकता है। लेकिन यह काम भी नहीं करता है यह टाइमर। टिक नहीं है विधि। // टाइमर 1 KeepMeAliveTimer.Interval = 15000; KeepMeAliveTimer.Tick + = KeepMeAlive; टाइमर 1 = नया टाइमर (); // टाइमर 2 टाइमर 1। इंटरवल = 15000; टाइमर 1। टिक + = टाइमर 1 डाक; // एक नया थ्रेड प्रारंभ किया है

नए कार्य में:

  // कुछ कार्य करने के बाद, यह टाइमर को KeepMeAliveTimer.Enabled = true; // टाइमर 1 KeepMeAliveTimer.start (); Timer1.Enabled = true; // टाइमर 2 टाइमर 1। प्रारंभ ();   

लेकिन यह टाइमर के टिकटिक घटनाओं को फायरिंग नहीं कर रहा है और यहां तक ​​कि कोई भी अपवाद नहीं फेंक रहा है।

दूसरा तरीका:

लेकिन जब मैंने एक ही धागे (मुख्य धागा) में टाइमर को आरम्भ किया और सक्षम किया तो वे पूरी तरह से काम कर रहे हैं:

  KeepMeAliveTimer = नया टाइमर (); // टाइमर 1 KeepMeAliveTimer.Interval = 15000; KeepMeAliveTimer.Tick + = KeepMeAlive; KeepMeAliveTimer.Enabled = true; KeepMeAliveTimer.Start (); टाइमर 1 = नया टाइमर (); // टाइमर 2 टाइमर 1। इंटरवल = 15000; टाइमर 1। टिक + = टाइमर 1 डाक; Timer1.Enabled = true; timer1.Start ();   

अब सवाल है; अगर कोई भी अपवाद भी नहीं है, तो पहली विधि क्यों काम नहीं कर रही है?

टाइमर वर्ग थ्रेड- सुरक्षित है, लेकिन जिस तरह से आप यह अपेक्षा करते हैं। वर्क थ्रेड पर स्टार्ट () विधि को कॉल करना वास्तव में टाइमर शुरू करता है क्लास एक छिपी हुई विंडो बनाने के प्रयास के माध्यम से चला जाता है ताकि वह सेट-टिमर WinAPi फ़ंक्शन को कॉल कर सकें और WM_TIMER संदेश प्राप्त कर सकें जब यह किया जाए।

लेकिन टिक संदेश नहीं उठाया जा सकता है, अगर कोई उस संदेश को नहीं सुन रहा है। आप नहीं होंगे, निश्चित रूप से आपने आवेदन नहीं बुलाया। उस धागे पर चलाओ। इसलिए आपको कार्यकर्ता धागा पर एक टाइमर शुरू नहीं करना चाहिए। नियंत्रण का उपयोग करें। BegunInvoke यदि आवश्यक हो तो इसे UI धागा पर शुरू किया गया।

या सिस्टम का उपयोग करें। थ्रेडिंग। टाइमर या सिस्टम। टायर्स। टाइमर, वे संदेश लूप पर निर्भर नहीं करते हैं। आपको ठीक से इंटरलॉक करना पड़ता है, उनकी बीत गई घटना या कॉलबैक अभी तक अन्य थ्रेड पर चलते हैं कौन सा समाधान है जो एक अन्य समस्या पैदा करने के लिए जाता है।

No comments:

Post a Comment