2012-10-14 48 views
7

यहाँ है कि मैं क्या है है - एक ItemsSource साथ एक ListBox एक ObservableCollection<T> करने के लिए सेट - जहां टी अपने कस्टम एक फ़ाइल का प्रतिनिधित्व करने वर्ग, सिर्फ 2 DependencyProperties युक्त है: फ़ाइल का नाम और ThumbnailPath। - सूची बॉक्स में एक कस्टम डेटा टेम्पलेट भी परिभाषित किया गया है, ताकि इसके तहत एक छवि और फ़ाइल नाम अच्छी तरह से प्रदर्शित किया जा सके।एसिंक्रोनस रूप ObservableCollection (या कोई वैकल्पिक) को जोड़ने

सूची बॉक्स का उद्देश्य थंबनेल (इस समस्या का हिस्सा नहीं है) के साथ मौजूदा फ़ोल्डर (ट्री व्यू में चयनित) में वीडियो फ़ाइलों को प्रदर्शित करना है।

तो जब मैं ट्री व्यू में फ़ोल्डर बदलता हूं, तो ऑब्जर्वेबल कोलेक्शन को साफ़ कर दिया जाता है और फिर भर जाता है, जो सूचीबॉक्स आइटम में स्वचालित रूप से दिखाई देता है।

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

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

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

+1

सटीक अपवाद प्रकार और संदेश क्या है उपयोग कर सकते हैं -

यहाँ कुछ लिंक है जो आप के लिए जा रहा प्राप्त कर सकते हैं कर रहे हैं? – Adam

+0

"निर्भरता स्रोत के रूप में उसी थ्रेड पर निर्भरता स्रोत बनाना चाहिए" –

+0

'बाध्यकारी, IsAsync = True' के बारे में क्या? –

उत्तर

12

चूंकि आपके ObservableCollection यूआई के लिए बाध्य है इसलिए यह यूआई थ्रेड पर जेनरेट हो जाता है ताकि किसी भी यूआई थ्रेड पर कोई और अपडेट (हटाएं/जोड़/साफ़) होना चाहिए। यह किसी अन्य थ्रेड से अपडेट की अनुमति नहीं देता है।

हालांकि, आप क्या कर सकते अपने वर्ग के insance (या सभी समय लेने पृष्ठभूमि धागे पर आपरेशन) बना है और एक बार आप कर रहे हैं, इस तरह से अपनी यूआई धागे की Dispatcher का उपयोग कर ObservableCollection में वस्तु को जोड़ने -

App.Current.Dispatcher.BeginInvoke((Action)delegate() 
          { 
           observableCollection.Add(instanceOfYourClass); 
          }); 

Dispatcher क्या ऑपरेशन को इसके संबंधित थ्रेड पर रखा जाता है। इसलिए, आइटम हमेशा यूआई थ्रेड पर जोड़ा जाएगा लेकिन पृष्ठभूमि धागे में बनाया जा सकता है। Updating from BW और अन्य एक here

+0

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

+0

हाँ आपके डीपी को यूआई थ्रेड पर ही बनाया जाना है।यदि आप इसे अपने यूआई में बांधना चाहते हैं, तो आपको डीपी का उपयोग करना होगा, लेकिन यदि नहीं, तो मैं 'आईएनपीसी' इंटरफेस को लागू करने वाली सरल 'पीओसीओ' गुणों के लिए जाने का सुझाव दूंगा। –

+0

मैं इसे बांधना चाहता हूं ... मेरे कस्टम डेटामैप्लेट के साथ, मेरे फ़ाइल क्लास इंस्टेंस की एक सूची प्रदर्शित करने के लिए मुझे सूची बॉक्स की आवश्यकता है। मुझे लगता है कि मैं आईएनपीसी के साथ जाऊंगा। –

5

.net 4.5 के साथ आप EnableCollectionSynchronization

object lockObj = new object(); 
     BindingOperations.EnableCollectionSynchronization(yourObservableCollection, lockObj);