लॉक किए बिना बाध्य संग्रह में हजारों आइटम कैसे जोड़ें, मेरे पास एक सेटअप है जहां संभावित रूप से हजारों आइटम (3000-5000 सोचें) ObservableCollection
में जोड़े जाएंगे जो कि कुछ दृश्य इंटरफ़ेस से बंधे हैं। वर्तमान में, उन्हें जोड़ने की प्रक्रिया काफी धीमी है (लगभग 4 सेकंड/1000 आइटम), और निश्चित रूप से उस समय के दौरान जीयूआई उत्तरदायी नहीं है। सिस्टम लॉकिंग के बारे में चिंता किए बिना कई वस्तुओं को एक संग्रह में ले जाने के लिए एक अच्छी विधि क्या है? मैंने DispatcherTimer
पर देखा है, लेकिन मुझे यकीन नहीं है कि यह सब कुछ प्रदान करेगा जो मुझे चाहिए।GUI
एक और सवाल - क्या मैं इन वस्तुओं के निर्माण को तेज करने के लिए कुछ कर सकता हूं ताकि उन्हें संग्रह में जोड़ने में इतना समय लगे? वर्तमान में मैं उन्हें इस प्रकार उपयोग करता हूं: Collection.Add(new Item(<params>))
पहले से ही पृष्ठभूमि थ्रेड में, आइटमों को उत्पन्न करने से, उन्हें ध्यान देने योग्य राशि में जोड़ने के लिए समय कम हो जाता है?
संपादित करें: वर्चुअलाइजेशन संभव नहीं है। आवश्यकताओं, एक WrapPanel
नज़र निर्दिष्ट इसलिए प्रदर्शन वास्तव में एक ListBox
है जो है एक टेम्प्लेट की ItemsPanel
EDIT2: स्टॉपवॉच के अनुसार, टोंटी वास्तव में मेरे ObservableCollection
में आइटम डाल रहा है। मैं उस संग्रह प्रकार को बदलने की कोशिश करूंगा और यह देखने के लिए अपनी खुद की अधिसूचना करूँगा कि क्या यह पर्याप्त रूप से गति करता है या नहीं।
संपादित 3: तो उत्तर एक ही स्थान पर है - मैंने ObservableCollection
से प्राप्त कक्षा बनाने के द्वारा इस समस्या को हल किया है (नीचे से सहायता के साथ)। इस वर्ग ने दो चीजें की - एक समय में संग्रह जोड़ने के लिए एक विधि का पर्दाफाश किया, और CollectionChanged
इवेंट को दबाने की क्षमता को जोड़ा। इन परिवर्तनों के साथ 3000 वस्तुओं को जोड़ने में लगने वाला समय मोटे तौर पर है। 4 सेकंड (9 7% सुधार)। This लिंक इन परिवर्तनों के कार्यान्वयन का विवरण देता है।
कुछ ऐसी चीजें हैं जो आप कर सकते हैं। आपका पर्यवेक्षण चयन बनाने से पहले सभी ऑब्जेक्ट्स बनाना संभव हो सकता है, इस तरह, एक बार जब आप इसे बनाते हैं, तो आप इसे पहले से मौजूद वस्तुओं के संग्रह के साथ प्रारंभ कर सकते हैं। एक अन्य विकल्प [ReactiveExtensions] (http://msdn.microsoft.com/en-us/data/gg577609.aspx) का उपयोग कर रहा है जो आपको अपने डेटा स्रोत को "निरीक्षण" करने और आपके अवलोकननीय कोलेक्शन को अतुल्यकालिक रूप से जोड़ने की अनुमति देगा। – Thelonias
इसके अलावा, यह आपके आइटम निर्माण के लिए होना चाहिए जो समय सिंक है, न कि "जोड़ें"। तो, क्या आप सृजन को किसी अन्य थ्रेड पर नहीं दबा सकते हैं, उन्हें कुछ मध्यवर्ती संग्रह में एकत्रित कर सकते हैं, और एक बार जब वे बनाए जाते हैं तो उन्हें GUI थ्रेड पर ऑब्जर्जेबल कोलेक्शन में जोड़ें? – Thelonias
@Ryan ये कुछ अच्छे अंक हैं। मैं सृजन को पृष्ठभूमि में ले जाऊंगा और फिर अपनी गति की रिपोर्ट करूंगा। – steveg89