2011-03-24 14 views
8

मुझे Application.Idle घटना के बारे में क्या पता है यह है कि एप्लिकेशन इसकी प्रसंस्करण को समाप्त कर रहा है और निष्क्रिय स्थिति में प्रवेश करने वाला है।आवेदन। सामान्य घटना महत्व

मैंने कहीं पढ़ा है कि

आप कार्यों है कि आप से पहले धागा के निष्क्रिय हो जाने करनी होगी, उन्हें इस घटना

तो संलग्न इस कार्य मतलब है है, तो इससे पहले कि प्रदर्शन किया जाएगा धागा निष्क्रिय हो जाता है, या धागा निष्क्रिय हो जाता है?

मेरे पास मेरे प्रोजेक्ट में थोड़ा सा कोड है, जो नीचे दिखाया गया है। निष्क्रिय समय के दौरान डेटाबेस अद्यतन किया जा रहा है?

private void Application_Idle(object sender, EventArgs e) 
{ 
    // Update the explorer's menuitems 
    team.UpdateMenu(); 

    // Update display toolbars. 
    team.UpdateToolBar(); 

    // Update SaveAll 
    SaveAll.Enabled = teaj.IsModified; 

    Up.Enabled = team.CanNavigateUp; 
    ... 
+0

तो इसका मतलब है कि अन्य उपयोगकर्ताओं के अपडेट के कारण डेटाबेस से अद्यतन डेटा प्राप्त करने के लिए इसका अर्थ यह होगा कि यह निष्क्रिय राज्य होने पर भी किया जाना चाहिए, कुछ अन्य बचत या कुछ अन्य डेडलॉकिंग स्थितियों के बीच में नहीं। – peter

उत्तर

19

पहले, समझते हैं कि Application.Idle है के बारे में "धागा बेकार" लेकिन आवेदन के यूआई धागे पर संदेश प्रसंस्करण के बारे में नहीं। (थ्रेड निष्क्रिय संदेश लूप निष्क्रिय से अलग है)

आपका WinForms ऐप एक संदेश लूप द्वारा संचालित होता है जो संदेश को कतार से बाहर खींचता है। जब वह कतार खाली हो जाती है, तो संदेश लूप एक शांत स्थिति में प्रवेश करता है, संदेश कतार में अगला संदेश प्रकट होने तक कुशलता से सो रहा है। यह सीपीयू प्रसंस्करण संसाधनों को संरक्षित करने में मदद करता है (एक लूप में कताई बर्बाद चक्र मशीन पर चल रही अन्य प्रक्रियाओं से सीपीयू समय दूर ले जाता है, इसलिए सब कुछ धीमा लगता है) और बिजली की खपत को कम करने में मदद करता है/लैपटॉप बैटरी जीवन का विस्तार करता है।

आपके ऐप का संदेश लूप आम तौर पर संदेश कतार बैकलॉग को अक्सर समाप्त करता है - जब आप एक संपादन बॉक्स में टाइप कर रहे होते हैं तो कीस्ट्रोक के बीच भी।

आवेदन। ऐडल इवेंट ऐप के प्राथमिक संचालन के साथ असीमित रूप से एप्लिकेशन हाउसकीपिंग कामों की देखभाल करने के लिए और कई धागे के साथ शामिल किए बिना एक सुविधाजनक स्थान बन गया है।

मेनू और बटन आम तौर पर निष्क्रिय होने पर उनके संबंधित कमांड स्टेटस से मेल खाने के लिए सक्षम या अक्षम होते हैं, उदाहरण के लिए। चूंकि दिखाई देने वाली उपस्थिति को केवल उपयोगकर्ता समय में अद्यतन करने की आवश्यकता है (उपयोगकर्ता दृश्य स्थिति को बदलकर आंतरिक राज्य परिवर्तनों के समय अंतर को समझ नहीं सकता है, दृश्य स्थिति को बाद में कुछ मिलीसेकंड बदलकर), एप्लिकेशन निष्क्रिय घटना है ऐसे हाउसकीपिंग कामों का ख्याल रखने का एक सरल और प्रभावी अवसर।

आप अपने Winforms ऐप के एप्लिकेशन में कोड डाल सकते हैं। डेटाबेस या नेटवर्क संसाधन की जांच करने के लिए अनुमति दें। हालांकि, आपको कुछ भी ऐसा करने के लिए सावधान रहना चाहिए जो "लंबे समय" लेता है क्योंकि यदि आप एप्लिकेशन को अवरुद्ध करते हैं। आईडी, आपका पूरा ऐप यूआई जमा हो जाएगा। कॉल अवरुद्ध करने के बजाय async कॉल का उपयोग करें।

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

+0

फिर हम उन घटनाओं को Application_idle में क्यों रखना चाहते हैं, मैंने जो भी सोचा था, जब भी कोई अन्य उपयोगकर्ता इस इंट्रानेट एप्लिकेशन को अपडेट कर रहा था, तो मैं अपने यूआई में बदलाव देख सकता हूं, इसलिए मैंने डेटाबेस अपडेट – peter

+0

कहा है कि हम application_idle में क्या कार्य कर सकते हैं घटना – peter

+0

हां, आप अपने WinForms ऐप के एप्लिकेशन में कोड डाल सकते हैं। डेटा अपडेट के लिए नेटवर्क संसाधन (डेटाबेस) की जांच करने के लिए अनुमति दें। हालांकि, आपको अभी भी सावधान रहना चाहिए कि ब्लॉकिंग कॉल का उपयोग न करें - अपने यूआई थ्रेड को फ्रीज करने से बचने के लिए एसिंक कॉल का उपयोग करें। – dthorpe

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