2010-09-29 9 views
21

मेरे पास कई साल पहले लिखे गए एप्लिकेशन में बाध्य अवरुद्ध कतार है। आइए बस यह कहें कि कार्यान्वयन तारकीय से कम है, लेकिन यह काम किया है। हालांकि, इसमें कुछ प्रदर्शन समस्याएं हैं। ऐसा लगता है कि .NET 4.0 BlockingCollection<T> सही प्रतिस्थापन है, लेकिन मुझे यह सुनिश्चित करने की ज़रूरत है कि यह वास्तव में एक कतार है। यही है, क्या यह एकल-निर्माता, सिंगल-उपभोक्ता फैशन में उपयोग किए जाने पर सख्ती से फीफो होने की गारंटी है?क्या ब्लॉकिंग कोलेक्शन <T> गारंटी हटाने का आदेश है?

प्रलेखन विशेष रूप से नहीं कहता है। BlockingCollection विषय कहता है (टिप्पणी में):

BlockingCollection<T> सिवाय इसके कि अंतर्निहित डेटा भंडारण तंत्र निकाला है दूर एक IProducerConsumerCollection<T> के रूप में, एक पारंपरिक अवरुद्ध कतार डेटा संरचना के समान है।

लेकिन कुछ भी विशेष रूप से नहीं कहता है कि चीजों को उसी क्रम में हटा दिया जाएगा।

कोई भी निश्चित रूप से जानता है?

+3

डाउनवॉटर, आपके पास कुछ कहना है? डाउनवोट का कारण देने के लिए यह परंपरागत है। –

उत्तर

38

ठीक है, BlockingCollection<T> वास्तव में समानांतर काम के लिए डिज़ाइन किया गया है, जहां आपके पास एकाधिक अनुकरणीय "उत्पादक" और एक उपभोक्ता (GetConsumingEnumerable() का उपयोग कर) है।

इस स्थिति में, आपके पास सम्मिलन आदेश की गारंटी देने का कोई तरीका नहीं है, इसलिए ऑर्डरिंग बाधाओं को निर्दिष्ट नहीं किया गया है।

कहा जा रहा है कि, BlockingCollection<T> किसी भी IProducerConsumerCollection<T> (निर्माता में निर्दिष्ट) पर काम करता है। यदि आप कन्स्ट्रक्टर में आंतरिक रूप से एक प्रदान नहीं करते हैं, तो यह ConcurrentQueue<T> का उपयोग करेगा। यह फीफो होने का कारण बनता है, क्योंकि यह वास्तव में (आंतरिक रूप से) एक कतार होगा। तो हां, डिफ़ॉल्ट रूप से, कम से कम वर्तमान कार्यान्वयन में, "एकल-निर्माता, सिंगल-उपभोक्ता फैशन में उपयोग किए जाने पर" सख्ती से फीफो होने की गारंटी दी जाएगी। आप (के बाद से कतार एक कार्यान्वयन विस्तार है) भविष्य प्रूफिंग के लिए इस बल चाहते हैं, बस इसे का निर्माण के रूप में:

var blockingCollection = new BlockingCollection<MyClass>(new ConcurrentQueue<MyClass>()); 

यही है कि यह अब एक कतार का उपयोग करता है, और भविष्य में (के बाद से कतार है गारंटी एक कार्यान्वयन विस्तार)।

+1

मुझे विश्वास नहीं है कि 'GetConsumingEnumerable' का अस्तित्व यह दर्शाता है कि संग्रह कई उत्पादकों और एक उपभोक्ता के लिए है। अनुमोदित, यह विशेष विधि एक उपभोक्ता के लिए बनाई गई प्रतीत होती है, लेकिन यह निश्चित रूप से कई उपभोक्ताओं को नहीं रोकती है। –

+0

@ जिम: यह नहीं करता है लेकिन यह उसके पीछे मुख्य प्रेरणा थी। एकाधिक उपभोक्ताओं को AddToAny() के माध्यम से लक्षित किया गया था, जहां एक प्रासंगिक उपभोक्ता द्वारा चयनित प्रत्येक ब्लॉकिंग कोलेक्शन का उपयोग किया जाता था।घटना का नाम स्वयं "ब्लॉकिंग कोलेक्शन" सुझाव दे रहा है कि आइटम जोड़े जाने तक यह "ब्लॉक" (उपभोक्ता पक्ष पर) है। –

+0

आपने मेरे तत्काल प्रश्न का उत्तर दिया, मुझे खुद को आईडीएएसएम रखने से रोक दिया। धन्यवाद। –

1

शायद इस प्रश्न के बाद से एमएसडीएन दस्तावेज अद्यतन किया गया है लेकिन अब यह स्पष्ट रूप से बताता है कि ब्लॉकिंग कोलेक्शन एफआईएफओ को डिफ़ॉल्ट रूप से तब तक डिफ़ॉल्ट कर देगा जब तक अन्यथा निर्देशित नहीं किया जाता है।

देखें: https://msdn.microsoft.com/en-us/library/dd997371(v=vs.110).aspx या में मामला एमएस लिंक गूगल 'निर्दिष्ट संग्रह प्रकार' उस पृष्ठ पर के लिए 'MSDN BlockingCollection अवलोकन'

नेट फ्रेमवर्क 4.6 और 4.5

देखो बदल जाते हैं।

संबंधित मुद्दे

 संबंधित मुद्दे