2011-01-11 17 views
16

पर बहुसंख्यक पहुंच को क्रमबद्ध करने के लिए कैसे करें मेरे पास मेरे कोड में कुछ स्थितियां हैं जहां विभिन्न धागे कार्य आइटम बना सकते हैं, विभिन्न कारणों से, नहीं किया जाना चाहिए समान्तर में। मैं यह सुनिश्चित करना चाहता हूं कि काम फीफो तरीके से किया जाए, भले ही इसमें से कौन सा धागा आता है। जावा में, मैं काम आइटम को एक थ्रेडेड ExecutorService पर रखूंगा; सी # में बराबर है? मैंने Queue और lock(){} ब्लॉक का एक गुच्छा के साथ कुछ इकट्ठा किया है, लेकिन यह कुछ अच्छा होगा और परीक्षण का उपयोग करने में सक्षम होना अच्छा होगा।सी # जावा निष्पादक सेवा के लिए समकक्ष। NewSingleThreadExecutor(), या: संसाधन

अद्यतन: क्या किसी के पास सिस्टम के साथ अनुभव है। थ्रेडिंग। कार्य? क्या इस तरह की चीज के लिए इसका समाधान है? मैं एक मोनोटच ऐप लिख रहा हूं, इसलिए कौन जानता है कि मुझे इसका बैकपोर्ट संस्करण भी मिल सकता है, जिससे मैं काम कर सकता हूं, लेकिन कम से कम भविष्य के बारे में सोचने के लिए कुछ ऐसा होगा।

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

+0

यदि काम को फीफो तरीके से किया जाना चाहिए, तो "विभिन्न" थ्रेड क्यों बनाएं? एक धागे पर काम क्यों नहीं करते? – Mark

+0

@ मार्क विभिन्न कारणों के लिए विभिन्न धागे मौजूद हैं - कुछ काम यूआई गतिविधि द्वारा ट्रिगर किया गया है, कुछ नेटवर्क अनुरोधों के जवाब में, कुछ टाइमर द्वारा। –

+0

इस प्रश्न के लिए: "संसाधन के लिए बहुसंख्यक पहुंच को क्रमबद्ध करने के लिए कैसे?" आपने स्वयं उत्तर दिया: अपने संसाधनों पर लॉक() कथन का उपयोग करें (या एक ऑब्जेक्ट जो उन्हें अक्षम करता है)। – BertuPG

उत्तर

3

आप ConcurrentQueue उपयोग कर सकते हैं, (यदि monotouch .net 4 का समर्थन करता है?) यह धागा सुरक्षित है और मुझे लगता है कि कार्यान्वयन वास्तव में लॉकसेल है। यदि आपके पास लंबे समय से चलने वाला कार्य है (जैसे विंडोज़ सेवा में) तो यह बहुत अच्छा काम करता है।

आम तौर पर, आपकी समस्या यह लगता है कि आपके पास एक उपभोक्ता के साथ कई उत्पादक हैं।

var work = new ConcurrentQueue<Item>(); 
var producer1 = Task.Factory.StartNew(() => { 
    work.Enqueue(item); // or whatever your threads are doing 
}); 
var producer2 = Task.Factory.StartNew(() => { 
    work.Enqueue(item); // etc 
}); 
var consumer = Task.Factory.StartNew(() => { 
    while(running) { 
     Item item = null; 
     work.TryDequeue(out item); 
    } 
}); 
Task.WaitAll(producer1, producer2, consumer); 

आप BlockingCollection उपयोग करें यदि आप काम मदों की एक परिमित पूल होना चाहिए। Here's an MSDN page सभी नए समवर्ती संग्रह प्रकार दिखा रहा है।

1

मेरा मानना ​​है कि यह एक SynchronizationContext का उपयोग किया जा सकता है। हालांकि, मैंने केवल यूआई थ्रेड पर पोस्ट करने के लिए ऐसा किया है, जिसमें पहले से ही एक सिंक्रनाइज़ेशन संदर्भ है (यदि स्थापित किया जाना है) .NET द्वारा प्रदान किया गया है - मुझे नहीं पता कि इसे "वेनिला थ्रेड से उपयोग के लिए कैसे तैयार किया जाए " हालांकि।

कुछ लिंक मैं "कस्टम synchronizationcontext प्रदाता" के लिए मिला (मैं इन की समीक्षा करने के लिए पूरी तरह से काम कर रहे/संदर्भ समझ में नहीं आता समय नहीं था, न ही मैं किसी भी अतिरिक्त जानकारी की क्या ज़रूरत है):

  1. Looking for an example of a custom SynchronizationContext (Required for unit testing)

  2. http://codeidol.com/csharp/wcf/Concurrency-Management/Custom-Service-Synchronization-Context/

मुबारक कोडिंग।

-2

जैसा कि मैंने टिप्पणियों में लिखा था, आपने स्वयं से पता चला कि lock कथन काम कर सकता है।

यदि आप "कंटेनर" प्राप्त करने में रुचि रखते हैं जो काम की वस्तुओं की कतार प्रबंधन के लिए आसान काम कर सकता है, तो ThreadPool कक्षा देखें।

मुझे लगता है कि, इन दो elemnts (ThreadPool वर्ग और lock कथन) के साथ एक अच्छी तरह से डिज़ाइन किया गया आर्किटेक्चर में, आप संसाधनों तक आसानी से और सफलतापूर्वक क्रमबद्ध कर सकते हैं।

+2

मेरे प्रश्न में प्रासंगिक वाक्यांश "एक साथ cobbled" है, और आपके उत्तर में प्रासंगिक एक "अच्छी तरह से डिजाइन वास्तुकला में" है। असल में, जबकि मैं क्रूर होने वाला नहीं हूं और इसे वोट देता हूं, "उपकरण मौजूद हैं, इसे समझने के लिए पता लगाएं" वास्तव में एक जवाब नहीं है। –

+0

आप जो भी चाहते हैं उसे नीचे वोट कर सकते हैं। मेरे पास कॉपी और पेस्ट करने और अपना काम करने के लिए एक पूर्ण उदाहरण बनाने का कोई समय नहीं है। आपने कतार के बारे में लिखा था, मुझे लगता है कि आपने इसे थ्रेड प्रबंधित करने के लिए इस्तेमाल किया था, और मैंने आपको अपने काम को सरल बनाने के लिए थ्रेडपूल क्लास को देखने का सुझाव दिया था। क्या गलत है?!? – BertuPG

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