मैंने एक दिलचस्प समस्या में भाग लिया है। यह जानकर कि ConcurrentDictionary<TKey, TValue>
संशोधित होने पर सुरक्षित रूप से गणना योग्य है, (मेरे मामले में) गायब हो जाने या कई बार प्रकट होने वाले तत्वों पर पुनरावृत्ति करने के अवांछित दुष्प्रभाव के साथ, मैंने ToList()
का उपयोग करके स्वयं स्नैपशॉट बनाने का निर्णय लिया। चूंकि ConcurrentDictionary<TKey, TValue>
भी ICollection<KeyValuePair<TKey, TValue>>
लागू करता है, इस List(IEnumerable<T> collection)
प्रयोग की जाने वाली है, जो बारी में शब्दकोश वर्तमान आइटम Count
का उपयोग कर की वर्तमान आकार में एक सरणी बनाता है का कारण बनता है, तो using ICollection<T>.CopyTo(T[] array, int arrayIndex)
आइटम पर कॉपी करने, अपने ConcurrentDictionary<TKey, TValue>
कार्यान्वयन में बुला प्रयास करता है, और अंत में इस दौरान शब्दकोष में जोड़े जाने पर ArgumentException
फेंकना।कॉलिंग टूलिस्ट() पर ConcurrentDictionary <TKey, TValue> आइटम जोड़ने के दौरान
सभी को लॉक करना संग्रह के उपयोग के बिंदु को मारने के बिंदु को मार देगा, इसलिए मेरे विकल्प अपवाद को पकड़ने और पुनः प्रयास करने के लिए प्रतीत होते हैं (जो निश्चित रूप से समस्या का सही उत्तर नहीं है), या मेरे लागू करने के लिए इस समस्या के लिए ToList()
का स्वयं का संस्करण (लेकिन फिर, बस एक सूची बढ़ रही है, तो शायद कुछ तत्वों के लिए इसे सही आकार में ट्रिम करना एक ओवरकिल जैसा लगता है, और लिंक्डलिस्ट का उपयोग करके अनुक्रमण प्रदर्शन में कमी आएगी)।
इसके अलावा, यह निश्चित LINQ तरीकों कि पृष्ठभूमि (जैसे OrderBy
के रूप में) में एक बफर के कुछ प्रकार बनाने जोड़ने की तरह लगता है प्रदर्शन की कीमत पर समस्या ठीक करने लगते है, लेकिन नंगे ToList()
स्पष्ट रूप से नहीं करता है, और जब कोई अतिरिक्त कार्यक्षमता की आवश्यकता नहीं होती है तो यह किसी अन्य विधि के साथ "संवर्द्धन" के लायक नहीं है।
क्या यह किसी समवर्ती संग्रह के साथ कोई समस्या हो सकती है?
इस तरह के स्नैपशॉट बनाने के दौरान प्रदर्शन को कम से कम हिट रखने के लिए उचित कार्यवाही क्या होगी? (अधिमानतः कुछ LINQ जादू के अंत में।)
संपादित करें:
इस पर ध्यान देने के बाद मुझे इस बात की पुष्टि कर सकते हैं, ToArray()
(लगता है कि मैं सिर्फ कल यह द्वारा पारित) वास्तव में के रूप में स्नैपशॉट समस्या को हल करता है जब तक यह एक साधारण स्नैपशॉट है, यह तब मदद नहीं करता है जब स्नैपशॉट (जैसे फ़िल्टरिंग, सॉर्टिंग) लेने से पहले अतिरिक्त कार्यक्षमता की आवश्यकता होती है, और अंत में एक सूची/सरणी की आवश्यकता होती है। (इस मामले में, एक नया कॉल फिर से नया संग्रह बनाने की आवश्यकता है।)
मैं यह इंगित करने में असफल रहा कि स्नैपशॉट को इन संशोधनों के माध्यम से जाने की आवश्यकता हो सकती है या नहीं, इसलिए इसे लिया जाना चाहिए अंत में, अधिमानतः, इसलिए मैं इसे प्रश्नों में जोड़ दूंगा।
(इसके अलावा, अगर किसी को भी किसी शीर्षक के लिए एक बेहतर विचार है, बताऊँ।)
'टोएएरे()' का उपयोग करें जो इसके बजाय विशेष रूप से प्रकार द्वारा लागू किया गया है। –