multithreading - WPF: issue updating UI from background thread -


मेरा कोड एक पृष्ठभूमि थ्रेड लॉन्च करता है पृष्ठभूमि थ्रेड परिवर्तन करता है और मुख्य थ्रेड में UI को अपडेट करने के लिए चाहता है। कोड जो थ्रेड को लॉन्च करता है, तो प्रतीक्षा करता है जैसे कुछ दिखता है:

  थ्रेड fThread = नया थ्रेड (नया थ्रेडस्टार्ट (PerformSync)); FThread.IsBackground = सच; fThread.Start (); fThread.Join (); MessageBox.Show ("सिंक्रनाइज़ेशन पूर्ण");  

जब पृष्ठभूमि UI को अपडेट करना चाहती है, तो यह एक स्टेटमैसेज सेट करता है और नीचे कोड कॉल करता है:

  स्थिर स्थिति संदेश _स्टैटस संदेश; सार्वजनिक प्रतिनिधि शून्य AddStatusDelegate (); निजी शून्य AddStatus () {AddStatusDelegate methodForUIThread = प्रतिनिधि {_statusMessageList.Add (_statusMessage); }; यह। डिस्पाचर। बेसिक इनवोक (विधि फोरहाइट, सिस्टम। विन्डोज। थ्रेडिंग। डिस्पैचर अग्रिम। }  

_statusMessageList एक ObservableCollection है जो एक ListBox के लिए स्रोत है।

ऐडस्टैटस विधि को बुलाया जाता है, लेकिन मुख्य थ्रेड पर कोड कभी भी कार्यान्वित नहीं होता है - अर्थात, _statusMessage_statusMessageList में जोड़ा नहीं है, जबकि थ्रेड निष्पादित है। हालांकि, एक बार यह पूर्ण हो गया है (एफटीएचआरईडी.जोन्स () रिटर्न), मुख्य थ्रेड पर सभी स्टैक किए गए कॉल्स निष्पादित होते हैं।

लेकिन, अगर मैं fThread.Start पर कॉल के बीच एक संदेश बॉक्स प्रदर्शित करता हूं ( ) और fThread.Join (), तो स्थिति संदेश ठीक से अद्यतन किया जाता है।

मुझे थ्रेड को समाप्त करने के लिए इंतजार करते समय मुख्य थ्रेड में कोड (UI अपडेट) निष्पादित करने के लिए क्या बदलने की आवश्यकता है?

धन्यवाद।

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

आपको क्या करने की ज़रूरत है ऐसा कुछ (अनचेस्टर, लेकिन आपको यह विचार प्राप्त करना चाहिए):

 < कोड> शून्य कुछ यूआईईटीटक्यूजसबैकंडप्रोसेसिंगटॉस्टस्ट () {थ्रेड एफटीएच्रेड = नया थ्रेड (नया थ्रेडस्टार्ट (प्रदर्शन एसआईसीसी)); FThread.IsBackground = सच; // यहाँ कुछ यूआई घटकों को अक्षम करें, ताकि उपयोगकर्ता // दूसरी बार थ्रेड को शुरू न कर सके ... fThread.Start (); // * थ्रेड को कॉल न करें। यहां जुड़ें, ताकि आपका मुख्य थ्रेड ब्लॉक न हो जाए! } Void PerformSync () {try {// अपने सामान यहाँ ...} अंत में {Dispatcher.Invoke (नई एक्शन (प्रोसेसिंग डोन)); }} Void प्रसंस्करण डोन () {// UI घटकों को पुन: सक्षम करें ... MessageBox.Show ("सिंक्रनाइज़ेशन पूर्ण"); }  

बेशक, WPF में, यूआई घटकों को निष्क्रिय / सक्षम करने के लिए कुछ IsBusyProcessing निर्भरता संपत्ति का प्रयोग किया जाता है जो प्रश्न में यूआई तत्वों को ट्रिगर से बाध्य है , लेकिन यह एक और कहानी है ...

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


Comments