डिस्पैचर का सही ढंग से उपयोग करें।
आपको डिस्पैचर थ्रेड से अपने Listbox (या उसके डेटा स्रोत) में चीज़ें जोड़नी होंगी, अन्यथा यूआई विस्फोट हो जाएगा। जब आप ऐसा करते हैं, तो आप या तो उस धागे पर पहले से ही एक विधि में हैं (उम्मीद है कि अधिक संभावना है) आप पृष्ठभूमि थ्रेड में हैं और आइटम जोड़ने के लिए Dispatcher.BeginInvoke
का उपयोग कर रहे हैं।
जब आप डिस्पैचर में अपडेट को लात मारते हैं, तो प्राथमिकता के रूप में Dispatcherpriority.Normal
का उपयोग करें। डिस्पैचर में कार्य आइटमों की कतार है और आपकी Normal
आइटम उस कतार में उच्च (शायद आश्चर्यजनक रूप से) धक्का देगी।
कोड का बिट जो डेटा अंतर्निहित डेटा बदलता है, DispatcherPriority.DataBind
पर चलता है, जो Normal
से कम है। इसका अर्थ यह है कि डेटा बाध्यकारी आमतौर पर अपडेट नहीं किया जाएगा जब तक कि आपके सभी आइटम जोड़े नहीं जाते हैं (या वैकल्पिक रूप से, यदि आपके आइटम जोड़ने के लिए लंबा समय लगता है, तो यह तब हो सकता है जब डिस्पैचर आइटम जोड़ने के बीच निष्क्रिय हो)।
वास्तव में आपके नियंत्रण को प्रस्तुत करने वाले कोड का थोड़ा सा (कहें, जब इसका बाध्यकारी सिग्नल अपडेट होता है) DispatcherPriority.Render
पर चलता है और बाध्यकारी से भी कम प्राथमिकता है। इसका मतलब है कि आपका नियंत्रण केवल तब प्रस्तुत करेगा जब डिस्पैचर अपडेट करने के लिए बाइंडिंग से बाहर हो गया है, जो बदले में तभी होगा जब डिस्पैचर प्रक्रिया से जोड़ता है-प्रक्रिया में जोड़ता है।
यदि यह अजीब लगता है, तो याद रखें कि प्रत्येक परत (अपडेट - बाइंडिंग - रेंडर) नीचे की परत पर एक रूपक ध्वज सेट करने का कारण बनती है - आपको दस बाइंडिंग नहीं मिलती हैं और फिर दस रेंडर नहीं होते हैं। यदि आपका आइटम जोड़ता है, तो आप अपने सभी जोड़ों को एक बाइंड और एक रेंडर के बाद प्राप्त करेंगे - जो सही है।
असल में: यदि आप डिस्पैचर का इरादा रखते हैं तो आपके पास चिंता करने की कोई बात नहीं होगी। ऐसा लगता है कि डिस्पैचर पर अपेक्षाकृत कम प्राथमिकता के रूप में प्रस्तुत करना गलत है, लेकिन वास्तव में, यह बहुत चालाक है :-)
स्रोत
2010-05-04 22:51:50
हां, मैं प्रोग्रामबॉक्स में सूची बॉक्स में आइटम जोड़ रहा हूं। ठीक है, दिखाने के लिए बहुत अधिक कोड नहीं है, क्योंकि मैंने अभी तक पूरे एप्लिकेशन को कोड नहीं किया है, मैं बस सूची बॉक्स का उपयोग करके इसे कैसे कर सकता हूं और निम्न कोड: (int i = 0; i <1000; i ++) { lbQuery.Items.Add (i); } वैसे भी, क्या आप मुझे अपने समाधान का कोड उदाहरण दे सकते हैं? – Lith
+1, उन्हें पहले सूची में बनाना, बेहतर होगा। जब तक यह असंभव न हो, तब आपको प्रत्येक ऐड के लिए रेड्रा के ओवरहेड के साथ रहना होगा। –
यदि आप पूरी सूची को एक बार में जल्दी से पॉप्युलेट कर सकते हैं तो आपको बाध्यकारी से पहले ऐसा करना चाहिए ... यदि नहीं, तो यदि आप बैच-एट-ए-टाइम या इसी तरह जोड़ सकते हैं तो आपके पास प्रत्येक एड के लिए एक रेड्रो नहीं होना चाहिए। –