2011-08-23 10 views
8

मैं एक विंडोज़ फॉर्म एप्लिकेशन (सी #) विकसित कर रहा हूं, और प्रोग्राम चल रहा है, यह ऑब्जेक्ट बनाता है उन्हें एक सूची में जोड़ता है। मुझे फीफो (पहली बार पहले बाहर) के साथ सूची में वस्तुओं को संसाधित करना होगा। मैं पृष्ठभूमि पृष्ठभूमि में ऐसा करना चाहता हूं और मुझे उन्हें क्रमशः संसाधित करना होगा, संख्या 1, संख्या 2, संख्या 3 और इसी तरह। और जैसे ही कोई आइटम सूची में जोड़ा जाता है, मैं इसे संसाधित करना चाहता हूं। तो मुझे उस सूची की जांच करने के लिए कुछ होना है।नौकरियों के लिए ब्लॉकिंग चयन या कतार <T>?

इसे प्राप्त करने का सबसे अच्छा तरीका क्या है?

मुझे पता है कि ब्लॉकिंगकोलेक्शन कुछ ऐसा ही करता है, जो इसे प्रसंस्करण से पहले किसी आइटम को जोड़ने के लिए प्रतीक्षा करता है।

मैं कतार के साथ एक ही धागे का उपयोग कर सकता हूं और बस (सत्य) और यदि कोई है तो आइटम ले सकता है?

आपको क्या लगता है?

उत्तर

14

लगता है कि आप BlockingCollection<T> के लिए जाना चाहिए यदि आप पृष्ठभूमि थ्रेड का उपयोग करने की योजना बना रहे हैं। आप आसानी से उसी while(true) तर्क को आसानी से कर सकते हैं जिसे आप ढूंढ रहे हैं।

BlockingCollection<T> आप के लिए दो महत्वपूर्ण सुविधाओं

  1. यह धागा सुरक्षित

  2. जब आप Take() कहते हैं, यह अवरुद्ध कर देगा (यानी जब तक प्रतीक्षा करें कुछ कतार में है) है देता है, तो आप ManualResetEvents और इसी तरह के किसी भी कोड को लिखने की ज़रूरत नहीं है, जो एक अच्छा सरलीकरण है।

+0

हाँ बिल्कुल! मैं सिर्फ यह सोच रहा हूं कि मेरे विचार की पुष्टि करने के लिए और अगर किसी के पास बेहतर विचार है :) – syncis

+2

@ जोनाथन बेरहल्टर: या, 'टेक' को कॉल करने के बजाय, वह अपने पृष्ठभूमि धागे को ''GetConsumingEnumerable'] पर' foreach 'कर सकता है। (http://msdn.microsoft.com/en-us/library/dd287186.aspx), जो आइटम को 'ब्लॉकिंग कोलेक्शन ' में रखा गया है, उतना ही उपज देगा। – casperOne

+0

@ सिंकिस: 'GetConsumingEnumerable' तब तक अवरुद्ध होगा जब तक कोई आइटम' ब्लॉकिंग कोलेक्शन 'में' आइटम 'की तरह नहीं जोड़ा जाएगा; बात यह है कि, इन वस्तुओं को संसाधित करने के अलावा आपका पृष्ठभूमि धागा क्या कर रहा है? यदि आप धागे को बचाने की कोशिश कर रहे हैं; नहीं, आप मूल रूप से थ्रेड पूल को फिर से लिख रहे हैं और यह आम तौर पर एक अच्छा विचार नहीं है। ध्यान दें, 'टेक' के लिए अधिक आइटम आ सकते हैं या 'GetConsumingEnumerable' के माध्यम से उत्पन्न होते हैं, जबकि आप अपनी वस्तुओं को एक-एक करके संसाधित कर रहे हैं (या आप अपनी आवश्यकताओं के आधार पर उन वस्तुओं को अन्य धागे में संसाधित करने के लिए भेज सकते हैं)। – casperOne

0

आप अवरोधित करना चाहते हैं, तो कतार खाली है तो BlockingCollection का उपयोग करें - यह आदर्श है ... आप इसे और अधिक पंक्ति की तरह (अपने आप तय करें कि एक खाली से निपटने के लिए) तो ConcurrentQueue चाहते हैं।

दोनों ConcurrentQueue सबसे आपरेशनों में, धागा सुरक्षित हैं ताला मुक्त तो वास्तव में तेजी से ... किसी भी तरह से सीधे इसका इस्तेमाल या उदाहरण BlockingCollection<string> = new BlockingCollection<string> (new ConcurrentQueue<string>) के लिए अपने BlockingCollection के लिए आधार प्रकार के रूप में लागू किया जाता है - आप भी एक अधिकतम capactiy पर डाल सकते हैं वह (कन्स्ट्रक्टर का वैकल्पिक दूसरा पैरा)।

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