2009-07-12 8 views

उत्तर

17

Application.DoEvents आमतौर पर यह सुनिश्चित करने के लिए प्रयोग किया जाता है कि जब आप UI थ्रेड पर कुछ लंबे समय से चल रहे ऑपरेशन कर रहे हों तो ईवेंट आवधिक रूप से संभाले जाएंगे।

एक बेहतर समाधान यह नहीं करना है। अलग थ्रेड पर लंबे समय से चलने वाले संचालन करें, यूआई थ्रेड पर मार्शलिंग (या तो Control.BeginInvoke/Invoke या BackgroundWorker के साथ) जब आपको यूआई अपडेट करने की आवश्यकता हो।

Application.DoEvents पुन: प्रवेश की संभावना का परिचय देता है, जो बहुत मुश्किल समझने वाली बग का कारण बन सकता है।

+0

जॉन, आपने कहा कि यह सुनिश्चित करने के लिए कि घटनाएं समय-समय पर संभाली जाएंगी ... कौन सी घटनाएं? अनुक्रमिक प्रोग्रामिंग में, मान लें कि हमारे पास एक फॉर्म पर एक बटन है। जब उपयोगकर्ता क्लिक करता है, उदाहरण के लिए फॉर्म की अस्पष्टता बदलती है ... अब, बटन के क्लिक को छोड़कर यहां किस तरह की घटनाएं हैं? – odiseh

+0

पश्चाताप, आकार, माउस आंदोलन इत्यादि। बहुत सारे कार्यक्रम हैं, भले ही आपका एप्लिकेशन कोड स्पष्ट रूप से उनमें से अधिकांश को संभाल नहीं लेता है। –

+0

@ जोनस्केट मैं 'DoEvents' के संभावित वैध उपयोग के संबंध में आपकी प्रतिक्रिया से प्यार करूंगा। https://stackoverflow.com/questions/45023826/is-this-a-valid-use-of-doevents-sample-project-included –

1

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

2

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

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

यदि आप व्यावहारिक रूप से इसे देखते हैं तो आप बेहतर विचार प्राप्त कर सकते हैं। बस निम्नलिखित कोड की प्रतिलिपि बनाएँ और आवेदन के बिना और बिना आवेदन के आवेदन की जांच करें। DoEvents()।

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     For i As Integer = 0 To 1000 
      System.Threading.Thread.Sleep(100) 
      ListBox1.Items.Add(i.ToString()) 
      Application.DoEvents() 
     Next 
    End Sub 
संबंधित मुद्दे