दिलचस्प पोस्ट
सबसे 3 एन तुलना करते समय स्टड :: मेक-हेप को कैसे कार्यान्वित किया जा सकता है? कैसे जांचें कि क्या System.Net.WebClient.DownloadData एक बाइनरी फ़ाइल डाउनलोड कर रहा है? जावास्क्रिप्ट चार्ट लाइब्रेरी स्ट्रिंग पायथन में सूचीबद्ध करने के लिए सी में एक एन्यूएम का आकार क्या है? जावा 8 में नक्शा और फ्लैटमैप के तरीकों के बीच अंतर क्या है? रिक्त स्थान के साथ jquery आईडी क्या psql में SELECT * FROM के लिए कोई शॉर्टकट है? पृष्ठभूमि का रंग मुद्रण पूर्वावलोकन में नहीं दिखा रहा है PHP इको लाइन ब्रेक एक मॉडल को एमवीसी में कैसे संरचित किया जाना चाहिए? बैकस्लैश – नियमित अभिव्यक्ति – जावास्क्रिप्ट HTML5 ऑडियो स्थिति सेट करना चेतावनी कैसे बढ़ाएं अगर रिटर्न वैल्यू अवहेलना है? बाहरी जेएस फाइल में एस्पनेट एमवीसी यूआरएल। एक्शन।

Application.DoEvents का उपयोग ()

क्या Application.DoEvents() सी # में इस्तेमाल किया जा सकता है?

क्या यह कार्य DoEvents को बाकी एप के साथ पकड़ने की अनुमति देने का एक तरीका है, जिस तरह से DoEvents के DoEvents करता है?

वेब के समाधान से एकत्रित समाधान "Application.DoEvents का उपयोग ()"

Hmya, DoEvents की स्थायी मिस्टिक () इसके खिलाफ एक बहुत बड़ी प्रतिक्रिया हुई है, लेकिन कोई भी वास्तव में कभी नहीं बताता है कि यह क्यों "बुरा" है। उसी तरह की बुद्धि के रूप में "एक संरचना को बदलना नहीं" Erm, क्यों रनटाइम और भाषा एक संरचना को बदलने में मदद करता है यदि यह बहुत बुरा है? उसी कारण: यदि आप इसे सही नहीं करते हैं तो आप अपने आप को पैर में गोली मार सकते हैं आसानी से। और सही करने के लिए यह जानना जरूरी है कि यह क्या करता है, जो डोइवेंट्स () के मामले में निश्चित रूप से गड़बड़ करने के लिए आसान नहीं है।

बॅट से बाहर: लगभग किसी भी विंडोज़ प्रपत्र कार्यक्रम में वास्तव में डूएन्ट्स () को कॉल होता है। यह चतुराई से प्रच्छन्न है, हालांकि एक अलग नाम के साथ: ShowDialog ()। यह दोईईन्ट्स () है जो एक डायलॉग को एप्लिकेशन के बाकी खिड़कियों को फ्रीज करने के बिना मॉडल बनाने की अनुमति देता है।

अधिकांश प्रोग्रामर अपने उपयोगकर्ता इंटरफ़ेस को ठंड से बंद करने के लिए DoEvents का उपयोग करना चाहते हैं, जब वे अपना मोडल लूप लिखते हैं। यह निश्चित रूप से ऐसा करता है; यह विंडोज संदेशों को प्रेषित करता है और डिलीवर किए गए किसी भी रंग अनुरोध को प्राप्त करता है। समस्या यह है कि यह चयनात्मक नहीं है यह न केवल डिस्पैच संदेश पेंट करता है, यह सबकुछ सब कुछ बचाता है

और सूचनाओं का एक सेट है जो परेशानी पैदा करता है। वे मॉनिटर के सामने लगभग 3 फुट से आते हैं। उपयोगकर्ता मुख्य विंडो को बंद कर सकता है, जबकि लूप जो कॉल करता है, DoEvents () चल रहा है। यह काम करता है, यूजर इंटरफेस चला गया है। लेकिन आपका कोड बंद नहीं हुआ, यह अभी भी लूप निष्पादित कर रहा है यह बुरी बात है। बहुत बहुत बुरा।

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

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

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

C # और VB.NET के अगले संस्करण नए इंतजार और async कीवर्ड के साथ एक अलग बंदूक प्रदान करेंगे। DoEvents और थ्रेड्स के कारण परेशानी से छोटे हिस्से में प्रेरित होकर, लेकिन WinRT के एपीआई डिज़ाइन द्वारा बड़े भाग में, आपको एक एसिंक्रोनस ऑपरेशन होने पर अपने यूआई अपडेट रखने की आवश्यकता होती है। एक फ़ाइल से पढ़ने की तरह

यह हो सकता है, लेकिन यह एक हैक है

क्या ईविल ईविल है?

एमएसडीएन पृष्ठ से सीधे संदर्भित है कि

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

तो माइक्रोसॉफ्ट इसके उपयोग के खिलाफ चेतावनी देता है

इसके अलावा, मैं इसे एक हैक मानता हूं क्योंकि इसका व्यवहार अप्रत्याशित है और साइड इफेक्ट प्रवण (यह अनुभव से आता है, बजाय नए थ्रेड को कताई करने या पृष्ठभूमि कार्यकर्ता का उपयोग करने के लिए डोईवेंट का उपयोग करने की कोशिश)।

यहां कोई मक़सद नहीं है – अगर यह एक मजबूत समाधान के रूप में काम करता है तो मैं इसे खत्म कर दूंगा। हालांकि, डोईएन्ट्स को .net में उपयोग करने का प्रयास करने से मुझे कुछ भी नहीं है लेकिन दर्द।

हां, सिस्टम वर्दी में अनुप्रयोग वर्ग में एक स्थिर DoEvents विधि होती है। फ़ॉर्म्स नाम स्थान। System.Windows.Forms.Application.DoEvents () UI धागे में एक लंबे समय से चलने वाले कार्य करते समय UI थ्रेड पर कतार में प्रतीक्षा संदेशों को संसाधित करने के लिए उपयोग किया जा सकता है। इसके लिए UI को बनाने के लाभ अधिक संवेदनशील होते हैं और एक लंबा कार्य चल रहा है, जबकि "लॉक" नहीं है। हालांकि, यह लगभग हमेशा काम करने का सबसे अच्छा तरीका नहीं है "DoEvents" को कॉल करने के लिए माइक्रोसॉफ्ट के मुताबिक, "सभी इंतजार खिड़की संदेशों पर संसाधित होने पर मौजूदा थ्रेड निलंबित किया जा सकता है।" यदि कोई घटना शुरू हो जाती है तो अनपेक्षित और आंतरायिक बगों को ट्रैक करना मुश्किल होता है यदि आपके पास एक व्यापक कार्य है तो इसे अलग थ्रेड में करना बेहतर होगा एक अलग धागे में लंबे समय तक काम चलाना उन्हें आसानी से चलाने के लिए जारी UI के साथ हस्तक्षेप किए बिना संसाधित करने की अनुमति देता है। अधिक जानकारी के लिए यहां देखें

यहां डोइवेंट्स का उपयोग करने का एक उदाहरण है; ध्यान दें कि माइक्रोसॉफ्ट भी इसका उपयोग करने के खिलाफ सावधानी बरतता है।

अपने अनुभव से मैं डोईवेंट्स का इस्तेमाल करते हुए बहुत सावधानीपूर्वक सलाह देता हूं। NET। मैं एक बहुत ही अजीब परिणाम का अनुभव किया है, जब एक DataCondViews युक्त TabControl में DoEvents का उपयोग करते हैं। दूसरी ओर, यदि आप सभी के साथ काम कर रहे हैं तो प्रगति पट्टी के साथ एक छोटा प्रपत्र है, तो यह ठीक हो सकता है।

निचली रेखा है: यदि आप दोईवेंट्स का उपयोग करने जा रहे हैं, तो आपको अपने आवेदन की तैनाती से पहले इसे पूरी तरह से जांचना होगा।

हाँ।

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

मैंने "DoEvents-Hack" का उपयोग करते हुए, कई व्यावसायिक अनुप्रयोगों को देखा है खासकर जब प्रतिपादन खेल में आता है, मैं इसे अक्सर देखता हूं:

 while(running) { Render(); Application.DoEvents(); } 

वे सभी उस विधि की बुरी चीज़ों के बारे में जानते हैं हालांकि, वे हैक का उपयोग करते हैं, क्योंकि वे किसी अन्य समाधान को नहीं जानते हैं। टॉम मिलर द्वारा ब्लॉग पोस्ट से कुछ तरीके दिए गए हैं:

  • WmPaint में सभी ड्राइंग होने के लिए अपना फ़ॉर्म सेट करें, और वहां अपना रेंडरिंग करें OnPaint विधि के अंत से पहले, सुनिश्चित करें कि आप ऐसा करते हैं। अमान्यता (); इससे ओनपेंट पद्धति को फिर से तुरंत निकाल दिया जाएगा।
  • Win32 एपीआई में पी / आवेज़ करें और पीकम मेसेज / ट्रांसमेलमैसेज / डिस्पैच मेसेज कॉल करें। (डूवेंट वास्तव में ऐसा कुछ करता है, लेकिन आप अतिरिक्त आवंटन के बिना ऐसा कर सकते हैं)
  • अपना स्वयं का फ़ॉर्म लिखें जो कि CreateWindowEx के चारों ओर एक छोटा आवरण है, और अपने आप को संदेश लूप पर पूर्ण नियंत्रण दें। -Dovents विधि आप के लिए ठीक काम करता है और इसके साथ रहना तय

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

मेरे मामले पर और विस्तार …

मैं यह सुनिश्चित करने के लिए निम्नलिखित (जैसा कि सुझाव दिया गया था ) एक प्रगति बार प्रकार छप स्क्रीन ( एक "लोडिंग" ओवरले प्रदर्शित करने के लिए कैसे … ) एक लंबे समय से चल रहे SQL कमान के दौरान अपडेट किया गया था:

 IAsyncResult asyncResult = sqlCmd.BeginExecuteNonQuery(); while (!asyncResult.IsCompleted) //UI thread needs to Wait for Async SQL command to return { System.Threading.Thread.Sleep(10); Application.DoEvents(); //to make the UI responsive } 

बुरे: मेरे लिए DoEvents को फोन करने का मतलब था कि माउस क्लिक कभी-कभी मेरे छप स्क्रीन के पीछे के रूपों पर गोलीबारी करते थे, भले ही मैंने इसे सबसे ऊपर बना दिया हो

अच्छा / उत्तर: मेरे स्प्लैश स्क्रीन, FormSplash.Panel1.Refresh() के केंद्र में एक छोटे पैनल पर एक साधारण रिफ्रेश कॉल के साथ डोईवेंट लाइन को बदलें। यूआई अच्छी तरह से अपडेट करता है और डोइवेंट्स वीडरनेस दूसरों ने चेतावनी दी है कि वह चला गया था।

Application.DoEvents विधि के लिए MSDN दस्तावेज़ देखें।

एप्लिकेशन.डॉइवेंट समस्याएं पैदा कर सकते हैं, अगर ग्राफ़िक्स प्रसंस्करण के अलावा कोई अन्य संदेश कतार में रखा गया है।

यह प्रगति सलाखों को अपडेट करने और उपयोगकर्ता की प्रगति के बारे में सूचित करने के लिए उपयोगी हो सकता है जैसे कि मेनफॉर्म निर्माण और लोडिंग, अगर कुछ समय लगता है।

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