कैसे साफ़ करें ConcurrentBag? ऐसा कोई भी तरीका नहीं है Clearया RemoveAll...
जवाबों:
यद्यपि यह संभावित दौड़ की स्थिति के कारण पूरी तरह से स्पष्ट नहीं हो सकता है, यह पर्याप्त है:
while (!myBag.IsEmpty)
{
myBag.TryTake(out T _);
}
अपडेट 10/03/2017: जैसा कि @Lou सही बताता है, असाइनमेंट परमाणु है। इस उदाहरण में, ConcurrentBagइच्छा का निर्माण परमाणु नहीं होगा, लेकिन उस संदर्भ को चर में रखना परमाणु होगा - इसलिए लॉक करना या इसके Interlocked.Exchangeआसपास सख्ती की आवश्यकता नहीं है।
कुछ और पढ़ने:
क्या एक संदर्भ असाइनमेंट थ्रेडसेफ़ है?
आप हमेशा बैग तक ही पहुंच बना सकते हैं और इसका एक नया उदाहरण बना सकते हैं। बैग में आइटम जीसी के लिए पात्र होंगे यदि उन पर कुछ और नहीं है:
lock (something)
{
bag = new ConcurrentBag();
}
या जैसा कि लुकाज़ोइड बताते हैं:
var newBag = new ConcurrentBag();
Interlocked.Exchange<ConcurrentBag>(ref bag, newBag);
सामग्री को बिन करने का आसान तरीका, हालांकि, यह मानता है कि जब भी कोई वस्तु एक्सेस करना चाहती है तो उसे लॉक भी मिल जाता है - यह महंगा हो सकता है और प्रदर्शन ट्यूनिंग को नकार सकता है जो ConcurrentBagस्वयं में चला गया है।
यदि आप जानते हैं कि इस समय और कुछ भी बैग तक नहीं पहुंचेगा, तो विंग-एंड-ए-प्रेयर इसे और लॉक न करें :-)
bag = newअशुद्धता के साथ कर सकते हैं ?
Interlocked.Exchangeएक लॉक से बेहतर हो सकता है
Interlocked.Exchangeयदि एक्सचेंज के समय एक और धागा बैग में जोड़ा जाता है तो कैसे काम करता है ? के Addदौरान बंद हो जाता है Exchange?
Interlocked.Exchangeयहां बेमानी हैं (और थ्रेड सुरक्षा प्रदान नहीं करते हैं)।
चयनित उत्तर एक तरह का है, ठीक है, एक वर्कअराउंड, इसलिए मैं अपना वर्कअराउंड जोड़ रहा हूं।
मेरा समाधान System.Collections.Concurrent नाम स्थान में सभी उपलब्ध संग्रहों को देखने के लिए था, जहां यह संग्रह से सभी तत्वों को साफ़ करने के लिए तुच्छ था।
ConcurrentStack वर्ग एक है साफ () विधि है जो संग्रह से सभी तत्वों को निकाल देता है। वास्तव में, यह नामस्थान (वर्तमान में) का एकमात्र संग्रह है जो करता है। हां, आपको Push(T element)इसके बजाय करना है Add(T element), लेकिन स्पष्ट रूप से यह उस समय के लायक है जो बचा है।
ConcurrentBag? मैं ऐसा करने के लिए कोई भी मूल संपत्ति या विधि नहीं देख सकता। Containsगणना नहीं करता। यह सामान्य IEnumerableएस के लिए एक विस्तार विधि है , और यह कुशल लेकिन कुछ भी है।
वर्कअराउंड की भावना में .. ConcurrentDictionary<T, bool>एक परमाणु स्पष्ट है, लेकिन अगर कुंजी मौजूद है, तो भी आपको जल्दी से जांच करने की अनुमति देता है। 'जल्दी' निश्चित रूप से एक सापेक्ष शब्द है, लेकिन आपके उपयोग के आधार पर यह एक बड़े स्टैक की गणना करने की तुलना में तेज़ हो सकता है।
.NET कोर 2.0 / .NET मानक 2.1 / .NET फ्रेमवर्क 5.0 के रूप में, एक Clear()विधि है ConcurrentBag<T>। देखें: ConcurrentBag.Clear ।