आपका यूआई अपडेट नहीं हो रहा है क्योंकि उपयोगकर्ता इंटरफ़ेस थ्रेड में सभी काम हो रहा है।
आपका कॉल:
this.BeginInvoke((MethodInvoker)delegate() {update.Action.Run(); })
कह रहा है कि "यह" (आपका फॉर्म) बनाया गया थ्रेड पर अपडेट.ऑक्शन.रुन() का आह्वान करें, जो यूजर इंटरफेस थ्रेड है।
Application.DoEvents()
वास्तव में यूआई थ्रेड को स्क्रीन को फिर से चलाने का मौका देगा, लेकिन मैं नए प्रतिनिधि को बनाने के लिए प्रेरित हूं, और उस पर BeginInvoke को कॉल करें।
यह थ्रेड पूल से आवंटित एक अलग थ्रेड पर update.Action.Run() फ़ंक्शन निष्पादित करेगा। फिर अद्यतन पूरा होने तक आप IAsyncResult की जांच कर सकते हैं, प्रत्येक चेक के बाद अपडेट ऑब्जेक्ट को इसकी प्रगति के लिए पूछताछ कर सकते हैं (क्योंकि आपके पास अन्य थ्रेड प्रगति पट्टी/यूआई अपडेट नहीं हो सकता है), फिर एप्लिकेशन को कॉल करना। DoEvents ()।
आपको एंडइनवोक() को बाद में कॉल करना होगा अन्यथा आप संसाधनों को लीक कर सकते हैं
मैं प्रगति संवाद पर रद्द बटन डालने का भी प्रयास करता हूं, और एक टाइमआउट जोड़ता हूं, अन्यथा यदि अपडेट फंस जाता है (या बहुत लंबा लगता है) तो आपका एप्लिकेशन हमेशा के लिए बंद हो जाएगा।