2011-02-17 11 views
5

मैंने बड़ी संख्या में कार्य उदाहरण बनाए हैं। मुझे उन सभी को चलाने की ज़रूरत है, और उन सभी को पूरा करने की प्रतीक्षा करें। समस्या यह है कि मुझे यह सुनिश्चित करने की ज़रूरत है कि किसी भी समय X से अधिक कार्य "प्रारंभ" और "पूर्ण" के बीच नहीं हैं; कार्यों में अन्य पार्टियों को कॉल शामिल है जिनके पास एक साथ कॉल की संख्या पर प्रतिबंध है। चूंकि ये प्रतिबंध मेरे हार्डवेयर पर आधारित नहीं हैं, इसलिए मैं बुद्धिमान थ्रॉटलिंग में निर्मित किसी भी पर भरोसा नहीं कर सकता; मुझे सीमा को सख्ती से लागू करने की आवश्यकता है। मैं कार्यों को बढ़ाने और थ्रेड-सुरक्षित तरीके से साझा चर को कम करके ऐसा करने में सक्षम हूं, लेकिन यह अनावश्यक रूप से बोझिल लगता है। क्या ऐसा कोई तरीका है जो सीधे एपीआई में अंतर्निहित है, या एक आसान सिंक्रनाइज़ेशन टूल मैं याद कर रहा हूं?कई .NET कार्य उदाहरणों को थ्रॉटल करने का सबसे अच्छा तरीका क्या है?

+1

एक सेमफोर मेरे लिए एक अच्छा समाधान की तरह लगता है। –

उत्तर

4

आप अपनी खुद की कार्य अनुसूचक बनाने के लिए, को देखने के How to: Create a Task Scheduler That Limits the Degree of Concurrency

संपादित करें: यह सेमाफोर के साथ की तुलना में अधिक कोड की आवश्यकता है, लेकिन मैं एक लग रहा है कि यह बेहतर प्रदर्शन कर सकती है, क्योंकि, जिसमें थ्रेड पूल कार्य क्रियान्वित कर रहे हैं आपके सेमफोर से अनजान है, लेकिन टास्कशेड्यूलर का उपयोग करके उनके नियमों से खेल रहा है।

संपादित करें 2: सेमाफोर का उपयोग कर के संभावित दोष यह है कि थ्रेड पूल सोच सकते हैं कि अपने कार्य को आईओ संचालन कर रही है और उन्हें एक बार में एक बहुत का निर्धारण करें (ताकि वे वहाँ लटका और इंतजार, क्योंकि वे डॉन ' टी सीपीयू की जरूरत है)। टास्कशेड्यूलर का उपयोग करके उन्हें ठीक उसी समय निर्धारित किया जाएगा जब उनके लिए जगह हो। यह निश्चित रूप से पूल क्लीनर रखेगा।

1

सेमाफोर वर्ग आप के लिए काम कर सकते हैं: http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx

वहाँ बताएंगे कि कैसे इसका इस्तेमाल करने के लिए इस MSDN पृष्ठ पर एक अच्छा उदाहरण है।

हल्का वजन भी निर्मित थ्रेड पूलिंग/सिंक्रनाइज़ेशन तंत्र हो सकता है जिसका उपयोग आप एक ही अंत को पूरा करने के लिए कर सकते हैं, लेकिन सेमफोर मूल रूप से जो भी आप पूछ रहे हैं उसे करने के लिए डिज़ाइन किया गया है।

+1

यदि .NET 4.0 और सेमफोर के बारे में बात करते हैं तो मैं सेमाफोरस्लिम को देखने की अनुशंसा करता हूं: http://msdn.microsoft.com/en-us/library/system.threading.semaphoreslim.aspx – Andrey

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