2010-09-25 25 views
5

मैं एक प्रोग्राम लिख रहा हूं जहां एक थ्रेड को कतार पर वस्तुओं को धक्का देने की आवश्यकता होती है, और एक या अधिक धागे कतार से वस्तुओं को पॉप करते हैं और उन्हें संसाधित करते हैं। स्मृति से बाहर निकलने से बचने के लिए, जब कतार पूरी हो जाती है तो मैं निर्माता धागा को सोना चाहता हूं। कुछ वस्तुओं की तुलना दूसरों की तुलना में अधिक प्राथमिकता है, इसलिए मैं उनको पहले संसाधित करना चाहता हूं। यदि वस्तुओं की प्राथमिकता समान है, तो मुझे वह पसंद है जिसे पहले संसाधित करने के लिए पहले जोड़ा गया था।थ्रेड-सेफ़ बुफर्ड अवलोकन योग्य प्राथमिकता कतार?

मैं एक WPF डेटा ग्रिड में शीर्ष 100 आइटम या तो प्रदर्शित करना चाहते हैं, तो यह भी एक यूआई धागा द्वारा पहुँचा जा करने की जरूरत है। अच्छा होगा अगर यह यूआई थ्रेड को सूचित कर सके कि एक अद्यतन भी है, यानी, IObservable लागू करता है।

वहाँ एक कंटेनर वर्ग कि यह सब करना होगा है?

बोनस अंक के लिए, मैं यकीन है कि पूरे कतार दोनों जब enqueing और dequeing बंद किया जा की जरूरत नहीं है हूँ।

.NET 4 कार्यान्वयन ठीक कर रहे हैं।

+0

BlockingCollection http://msdn.microsoft.com/en-us/library/dd997371.aspx होनहार लग रहा है ... लेकिन यह प्राथमिकताओं के बारे में कुछ भी उल्लेख नहीं है। यह कहता है कि यह किसी भी चीज को एन्कापुलेट कर सकता है जो IProducerConsumerCollection लागू करता है ... क्या उनमें से एक प्राथमिकता कतार है? – mpen

+0

इस उदाहरण को देखें http://msdn.microsoft.com/en-us/library/dd460690.aspx –

+1

FWIW कार्यों को आरएक्स अवलोकनों में बदल दिया जा सकता है। ;) –

उत्तर

2

यदि आप .NET 4 पर हैं तो आपको Task Parallel Library पर कस्टम शेड्यूलर के साथ गंभीरता से QueuedTaskScheduler उदाहरण पर विचार करना चाहिए। मुझे यकीन नहीं है कि यह आपकी सभी आवश्यकताओं को पूरा करता है, लेकिन यह एक अच्छी शुरुआत होगी।

+0

-1 ... उपयोगकर्ता द्वारा उल्लिखित किसी भी समस्या का समाधान नहीं करता है। – TomTom

+1

मैं अपने उत्तर के साथ निशान से बाहर हो गया था, लेकिन मैं दृढ़ता से असहमत हूं कि यह समस्या को हल नहीं कर सका। समर्पित धागे पर डेटा प्रोसेसिंग को प्रभावी रूप से संग्रह में डेटा के क्रम में निर्धारित किया जा रहा है। एक कार्य एक उच्च स्तरीय अमूर्त है जो डेटा और इसकी प्रसंस्करण को सीधे धागे से निपटने के बिना encapsulate सकता है - जिसमें कई लाभ हैं। इस तरह के परिदृश्य में शेड्यूलिंग को कार्य शेड्यूलर के माध्यम से हासिल किया जा सकता है। –

3

आप भाग्य एक कंटेनर की तलाश से बाहर हैं - आप एक अपने आप को लागू करने के लिए की है। प्राथमिकताओं के साथ सावधान रहें - सॉर्टिंग धीमी गति से हो जाती है। मैं क्या करता हूं कि मेरे पास एक कतार वर्ग है जो आंतरिक रूप से कई सरणी (एक प्रति प्राथमिकता - कोडित निम्न, मध्यम, उच्च) का उपयोग करता है। इस तरह मैं कभी सॉर्ट नहीं करता हूं। ताले से बचें यदि आप (बहु कोर मानते हैं) और स्पिनलॉक्स (.NET 4.0) के लिए जाते हैं, तो वे कतार परिदृश्य में तेज़/कम ओवरहेड लेते हैं।

+0

मैं कभी भी पूरे सम्मिलन का पूरा संग्रह नहीं लेता ... यह सिर्फ पागल है। जैसा कि आपने सुझाव दिया है, या किसी प्रकार की पेड़ संरचना के रूप में मैं एकाधिक सरणी (या कतार) का उपयोग करूंगा। – mpen

+0

वृक्ष संरचनाएं कई कतारों की तुलना में धीमी हैं (लेकिन अधिक प्राथमिकता यदि संभावित प्राथमिकताओं की संख्या उच्च है - जो शायद ही कभी समझ में आता है)। वृक्ष rebalances नरक मूल्य के अनुसार हैं, और आप किसी भी कतार में वैसे भी उन्हें खोजने की जरूरत नहीं है। – TomTom

2

मैंने जो किया है वह अतीत में कई ConcurrentQueue<T> संग्रहों को लपेटा गया है - TomTom suggests का प्रकार। यह बहुत उचित है जब आपके पास प्राथमिकताओं की संख्या कम है। उदाहरण के लिए कुछ मामलों में यह दो होने के लिए भी पर्याप्त हो सकता है: उच्च और निम्न। फिर अपने TryDequeue विधि सिर्फ इस तरह दिखता है:

public bool TryDequeue(out T item) 
{ 
    return _highItems.TryDequeue(out item) || _lowItems.TryDequeue(out item); 
} 

यह ठीक अपने प्रश्न के लिए एक व्यापक जवाब नहीं है, लेकिन शायद यह मदद कर सकते हैं आरंभ करने के लिए।

+0

हालांकि मुझे संभावित प्राथमिकताओं की संख्या सीमित करना पसंद नहीं है। मैं प्राथमिकता के लिए एक गणना मूल्य का उपयोग करना चाहता हूं, और मुझे पहले से सीमा नहीं पता है। – mpen

+0

@ मार्क: कभी-कभी लोग इसे 'सॉर्टेडलिस्ट <टीप्रियोरिटी, कतार >' आंतरिक रूप से कुछ करते हैं; लेकिन जैसा कि टॉमटॉम ने पहले से ही उल्लेख किया है, असीमित प्राथमिकताओं की लागत इसके लायक नहीं हो सकती है। एक समझौता के बारे में क्या: एक गणना मूल्य है जिसे एक निश्चित सीमा के भीतर कहां पर एक पूर्वनिर्धारित प्राथमिकता में अनुवादित किया जाता है? –

+0

हाँ ... मैं शायद सोच रहा हूं कि मुझे यही करना चाहिए। मुझे चीजों पर मनमाने ढंग से प्रतिबंध लगाने से नफरत है, लेकिन मुझे लगता है कि अगर मैं नहीं करता तो मैं अपने लिए बहुत अधिक काम कर रहा हूं। मैं इसे 'सॉर्टेड डिक्शनरी <टीप्रिओरिटी, कंसुरेंटक्यूयू >' लागू करने के माध्यम से आधा रास्ता था, जब मुझे एहसास हुआ कि मुझे दोनों को एनक्यूइंग और डेकिंग करते समय संरचना को लॉक करना होगा ताकि मैं चाबियाँ प्रबंधित कर सकूं, जो कुछ समवर्ती लाभ :( – mpen

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