2012-12-19 9 views
6

मुझे अक्सर उन वस्तुओं की कतार को संसाधित करने की आवश्यकता होती है जहां कोई भी उपयोगकर्ता कतार को अवरुद्ध करने में सक्षम नहीं होना चाहिए और कतार में आइटम को कुछ क्रम में संसाधित किया जाना चाहिए। मैं अक्सर ऐसा करने के लिए एक कक्षा लिखता हूं, लेकिन मैंने सोचा कि कुछ सामान्य संस्करण होना चाहिए लेकिन मुझे कोई नहीं मिल रहा है।जेनेरिक सी # राउंड रॉबिन (विभाजित/क्रमबद्ध) कतार

तो मैं एक कतार वर्ग की तलाश में हूं जहां मैं एक प्रकार, विभाजन के लिए एक चयनकर्ता और एक चयनकर्ता को आदेश दे सकता हूं ताकि मैं कतार में ऑब्जेक्ट्स जोड़ सकूं और फिर जब मुझे ऑब्जेक्ट्स वापस मिल जाए, तो मुझे मिल जाएगा मेरे आदेश विनिर्देशक द्वारा आदेशित अगले विभाजन से पहली वस्तु।

उदाहरण के लिए, मैं इस तरह कहेंगे को निर्दिष्ट विभाजन करने के लिए कैसे और कतार सॉर्ट करने के लिए कैसे:

var queue = new RoundRobinQueue<Message>(
      _ => _.UserID, 
      _ => _.SendDate 
      ); 

और बाद मैं संदेश के बहुत से जोड़ दिया है, मैं अपने कतार और इस प्रक्रिया में आइटम Parallel.ForEach कर सकते हैं उन्हें अगले User के लिए सबसे शुरुआती SendDate के क्रम में। इस तरह, यदि कोई उपयोगकर्ता धीमा है, तो उसके आइटम कतार को अवरुद्ध नहीं करेंगे क्योंकि वह केवल एक धागा प्राप्त करता है, लेकिन यदि केवल एक उपयोगकर्ता है, तो वह एकमात्र विभाजन है, इसलिए उसे सभी धागे मिलते हैं।

मैंने पूरी तरह से देखा लेकिन इसके लिए सी # में एक अच्छा जेनेरिक कार्यान्वयन नहीं मिला। कोई विचार?

+0

foreach IENumerable की आवश्यकता है। लेकिन भविष्यवाणी कैसे जान सकती है कि इस संग्रह को समाप्त करने के लिए, एक गोल रॉबिन कतार, हमेशा अगला है? आप कुछ गिनती या टाइमआउट द्वारा इसे तोड़ने के लिए मजबूर हो सकते हैं। लेकिन इस वर्ग के उपयोगकर्ताओं को चोट पहुंच सकती है अगर वे इसे गलत इस्तेमाल करते हैं, यहां तक ​​कि खुद भी। जैसे यह कतार आपके कोड में आईन्यूमेरेबल के रूप में पास की जा सकती है, और एक ऐसी विधि से गुज़रती है जो किसी भी आईनेमरेबल लेती है और उस पर फ़ोरैच करती है, ओह! – Ryan

+0

'Inumerable' के लिए एक एक्सटेंशन विधि क्यों नहीं है जो एक इटरेटर लौटाती है? – PPC

उत्तर

-1

System.Collections.Concurrent में परिभाषित कक्षाओं को देखें। निर्माता-उपभोक्ता पैटर्न के लिए एक सामान्य ConcurrentQueue के साथ ही अधिक बुनियादी बिल्डिंग ब्लॉक हैं।

उपलब्ध कक्षाएं और इंटरफेस MSDN पर सारांशित हैं।

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