2010-12-06 10 views
5

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

अब मैं क्या करना चाहता हूं, 3 अलग-अलग ऑब्जेक्ट्स पर 3 समान अनुरोधों को स्पिन करना है, जब तक कि वे सभी 'किए गए' तक प्रतीक्षा न करें (और यह मुझे पहला प्रश्न देता है: वे कैसे कहते हैं 'मैं कर रहा हूं' , और उसके बाद सभी डेटा thet've मुझे भेजा इकट्ठा

छद्म कोड में

तो मैं इस इंटरफेस है:।

ISearch s1 = new SearchLocal(); 
ISearch s2 = new SearchThere(); 
ISearch s3 = new SearchHere(); 

:

interface ISearch 
    SearchResult SearchForContent(SearchCriteria criteria) 

तो कोड में मैं तीन खोज सेवाओं को बनाने के और यह n उन सभी को तीन पर SearchForContent(SearchCriteria criteria) फोन, एक multihreaded/async रास्ता

में और वे सब उनके SearchResult साथ मेरे पास वापस आने के लिए और उसके बाद वे सभी से किया जाता है, मैं उनके SearchResult वस्तुओं की प्रक्रिया।

मुझे आशा है कि पाठ की इन पंक्तियों kindof तुम क्या मेरे सिर :)

मैं एक ASP.Net 3.5 सी # परियोजना पर काम कर रहा हूँ में है प्राप्त करता है।

+2

यह 'Task' वस्तुओं के साथ बात इस तरह का सबसे आसान है। उन्हें .NET 4 में पेश किया गया था, लेकिन इन्हें (असमर्थित, उपयोग-पर-अपने-जोखिम-जोखिम) [आरएक्स लाइब्रेरी] (http://msdn.microsoft.com/en-us/devlabs/ee794896) में बैकपोर्ट किया गया है। aspx)। आरएक्स एक विकल्प का उपयोग कर रहा है, या क्या आपको पूरी तरह से .NET 3.5 समाधान की आवश्यकता है? –

+0

नहीं, क्षमा करें, मुझे पूरी तरह से 3.5 समाधान की आवश्यकता है। – Michel

+0

गहह अब 3.5 के बारे में टिप्पणी पढ़ रहा है, मुझे लगता है कि कार्य आपके लिए काम नहीं करेंगे – BrokenGlass

उत्तर

6

AutoResetEvent बनाएँ और उन्हें WaitHandle.WaitAll()

के पास एक उदाहरण here नहीं है।

असल:

1) आप प्रत्येक खोज के लिए एक AutoResetEvent बना सकते हैं और इसके निर्माता को false गुजरती हैं।

2) धागे बनाएं और प्रत्येक के लिए और अंत में खोज चलाने, अंत में ब्लॉक में AutoResetEvent पर Set कहते हैं। यह बहुत महत्वपूर्ण है कि Set को कॉल करना आखिरकार ब्लॉक के अंदर किया जाता है अन्यथा WaitAll() अनिश्चित काल तक प्रतीक्षा करेगा।

3) कोड में थ्रेड बनाने के ठीक बाद कोड में, आप WaitHandle.WaitAll() पर कॉल करें और उन सभी AutoResetEvent को पास करें। यह कोड तक पूरा होने तक प्रतीक्षा करेगा।

+0

क्या यह थोड़ा और सटीक होना संभव है, मुझे नहीं लगता कि मुझे यह मिल जाएगा ... – Michel

+0

मैंने अपडेट किया है। यहां एक और उदाहरण है। http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.autoresetevent(VS.95).aspx – Aliostad

+0

@ एलीओस्टैड, आपको 'ऑटोरेट्स एवेन्ट्स' स्वीकार करने के लिए अपने 'आईसर्च' कार्यान्वयन को संशोधित करना होगा '(या जो भी प्रतीक्षा हैंडल आप चुनते हैं) उनके रचनाकारों में। इसके अतिरिक्त, आपको परिणामों को असीमित रूप से एक्सेस करने के लिए एक तरीका जोड़ना होगा (उदा।, 'ISearch.SearchResults {get;} ')। –

0

IEnumerable<ISearch> बनाएं, और उन वस्तुओं को, और .AsParallel().ForAll(...) पर करें।

संपादित

forall परिणाम नहीं देंगे, तो आप iSearch बदल सकते हैं, यह परिणामों के लिए एक संपत्ति है, तो दे एक बार forall किया जाता है आप IEnumerable के माध्यम से परिणाम देख सकते हैं।

और हाँ, क्षमा करें, यह 4.0 है।

+1

.NET 3.5, कोई भाग्य नहीं। –

+1

ForAll परिणाम वापस नहीं करेगा। –

2

कार्यों का उपयोग करके आप इस तरह एक निरंतरता कर सकता है:

 Task[] t = new Task[2]; 
     t[0] = Task.Factory.StartNew(() => { Thread.Sleep(1000); }); 
     t[1] = Task.Factory.StartNew(() => { Thread.Sleep(2000); }); 

     Task.Factory.ContinueWhenAll(t, myTasks => { Console.WriteLine("All done!"); }); 
+0

यह 3.5 है, लेकिन कोड के लिए धन्यवाद, वैसे भी, कभी नहीं पता कि मुझे 4.0 प्रोजेक्ट में इसकी आवश्यकता होगी! – Michel

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

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