2012-02-16 13 views
17

मैं वर्तमान में LimitedConcurrencyLevelTaskScheduler यहाँ विस्तृत http://msdn.microsoft.com/en-us/library/ee789351.aspxनेट टीपीएल: कार्य प्राथमिकता के साथ सीमित समवर्ती स्तर कार्य शेड्यूलर?

उपयोग कर रहा हूँ मैं इतना है कि व्यक्तियों कार्य प्राथमिकता दी जा सकती है, इस को बढ़ाने के लिए चाहते हैं। इन प्राथमिकताओं को थ्रेड प्राथमिकता के लिए मानचित्र की आवश्यकता नहीं है। इसे केवल उस क्रम को प्रभावित करना चाहिए जिसमें कार्य शुरू हो गए हैं।

किसी को भी इस तरह के एक कार्य अनुसूचक का एक उदाहरण के पता है? (शेड्यूलिंग सामान का एक बहुत तो यह बहुत अच्छा होगा अगर वहाँ एक मौजूदा समाधान था मेरे सिर पर है)

+0

अनुसूचक एक कतार के लिए एक LinkedList का उपयोग करता है कि:

निम्नलिखित कोड 4, दो प्राथमिकता कतारों और कार्यक्रम पहले कतार पर एक काम की एक अधिकतम संगामिति स्तर के साथ एक अनुसूचक पैदा करता है। इसे सॉर्टेडलिस्ट में बदलने का प्रयास करें जहां टी एक ऐसी संरचना है जिसमें कार्य और प्राथमिकता के लिए पूर्णांक होता है, और टी। प्राथमिकता पर सूची को सॉर्ट करें। –

+1

@IgbyLargeman - कुंजियों (प्राथमिकताओं) अद्वितीय होना है - [SortedList] (http://msdn.microsoft.com/en-us/library/ms132319.aspx) नहीं एक आदर्श समाधान हो सकता है। अधिकांश प्राथमिकता प्रणालियों में केवल कुछ स्तर होते हैं, और एकाधिक वस्तुओं को समान प्राथमिकता –

+0

असाइन करने की अनुमति देते हैं, यह एक बुरा विचार है। एक कतार आंतरिक रूप से कतारों का एक सेट (सरणी) है - प्रत्येक प्राथमिकता के लिए - एक बेहतर तरीका है। प्राथमिकताएं अद्वितीय नहीं हैं और उनमें से एक छोटी संख्या तक ही सीमित है। एक लिंक्ड सूची का भी उपयोग न करें - मेरे पास "कतार" है जो आंतरिक रूप से 4096 तत्वों के साथ-साथ ऑपॉइंटर्स के सरणी का उपयोग करता है। बहुत कम आवंटन - आइटम को "पृष्ठ" से हटा दिया जाता है, जिसे एनडी में जोड़ा जाता है। कम आवंटन, इकट्ठा करने के लिए कम कचरा। – TomTom

उत्तर

37

Parallel Extensions Extras Samples. पहले से ही इस तरह के एक अनुसूचक, QueuedTaskScheduler प्रदान करते हैं। यह शेड्यूलर उपयोग किए गए धागे के प्रकार और प्राथमिकताओं पर प्राथमिकताओं, समरूपता सीमा, निष्पक्षता और सुगंधित नियंत्रण प्रदान करता है। बेशक, आपको उन सुविधाओं का उपयोग या कॉन्फ़िगर करने की आवश्यकता नहीं है जिनकी आपको आवश्यकता नहीं है।

स्टीफन Toub समानांतर एक्सटेंशन अतिरिक्त here

में विभिन्न शेड्यूलर का एक संक्षिप्त विवरण प्रदान करता है QueuedTaskScheduler का उपयोग करने के लिए आपको प्राथमिकता आप की जरूरत के साथ अपने ActivateNewQueue विधि कॉल। यह विधि पैरेंट टास्कशेड्यूलर द्वारा प्रबंधित एक नया टास्कशेड्यूलर-व्युत्पन्न कतार वस्तु देता है। एक विशिष्ट कतार का उपयोग करने वाले सभी कार्य माता-पिता टास्कशेल्डर द्वारा उनकी प्राथमिकताओं के अनुसार निर्धारित किए जाते हैं।

QueuedTaskScheduler qts = new QueuedTaskScheduler(TaskScheduler.Default,4); 
TaskScheduler pri0 = qts.ActivateNewQueue(priority: 0); 
TaskScheduler pri1 = qts.ActivateNewQueue(priority: 1); 

Task.Factory.StartNew(()=>{ }, 
         CancellationToken.None, 
         TaskCreationOptions.None, 
         pri0); 
+0

+1: समांतर विस्तार अतिरिक्त अमूल्य है! – dotnetguy

1

कार्य सूची के लिए कुछ हल या प्राथमिकता डेटा संरचना का उपयोग करें। फिर अपनी खुद की जोड़ी बनाएं जो प्राथमिकता लेती है। यह दूसरों के जितना अच्छा नहीं हो सकता है लेकिन यह कार्य सूची को प्राथमिकता देगा। आप वहां 99% कोड का पुन: उपयोग कर सकते हैं। बस लिंक्डलिस्ट को सॉर्ट की गई सूची के साथ प्रतिस्थापित करें या एक विधि जोड़ने और लिखने के लिए LINQ का उपयोग करें जो प्राथमिकता लेता है।

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