2012-08-30 13 views
6

कहा जाता है कि मैं एक निर्माता-उपभोक्ता समस्या का उपयोग कर रहा हूं और इसमें ब्लॉकिंग कोलेक्शन है जो मैं डेटा उत्पन्न करता हूं और इससे तारीख का उपभोग करता हूं। मैं डेटा बनाने के लिए मेथोड को कॉल करता हूं और ब्लॉकिंगकोलेक्शन को पूर्ण करने के लिए सेट करता हूं ताकि उपभोक्ता बीसी (ब्लॉकिंगकोलेक्शन) से सभी डेटा उपभोग कर सके, और कुछ प्रोसेसिंग के बाद एप्लिकेशन बीसी में कुछ अन्य डेटा जोड़ना चाहता है, लेकिन यह नहीं कर सकता क्योंकि यह पूर्ण करने के लिए सेट है, मैं पूर्ण करने के लिए पूर्ण संपादन कैसे सेट कर सकता हूं, या मैं बीसी से सभी डेटा कैसे उपभोग कर सकता हूं, ComleteAdding की प्रतीक्षा नहीं कर रहा हूं?पूर्ण करने के बाद ब्लॉकिंग कोलेक्शन में जोड़ने के लिए

धन्यवाद।

उत्तर

10

आप नहीं कर सकते - CompleteAdding पर कॉल करने का पूरा बिंदु कहने के लिए है, "इस संग्रह में कभी और डेटा जोड़ा नहीं जाएगा। एक बार यह खाली हो जाने पर, आप जानते हैं कि आप कर चुके हैं।" जो आप पूछ रहे हैं वह थोड़ा सा कहने जैसा है, "नेटवर्क कनेक्शन बंद करने के बाद, मैं इसे फिर से खोल सकता हूं ताकि मैं और डेटा लिख ​​सकूं?"

तथ्य यह है कि चाहते हैं कि आपको अपने डिज़ाइन पर पुनर्विचार करना चाहिए। शायद आपको इस बिंदु पर एक नया BlockingCollection बनाना चाहिए? या शायद आप वास्तव में से शुरू करने के लिए CompleteAdding पर कॉल करना चाहते हैं?

+0

लेकिन अगर मैं CompleteAdding को कॉल नहीं करता, तो लूप कैसे समाप्त होता है? क्योंकि मैं एक लूप विहट का उपयोग करता हूं। GetConsumingEnumerable() गुण – XandrUu

+0

@XandrUu: सामान्य रूप से यह सही नहीं होगा, क्योंकि आप अधिक डेटा डाल रहे होंगे। अगर आप "इस बैच को समाप्त करना" विचार चाहते हैं, तो आप शायद एक सेंटीनेल मूल्य पर विचार करना चाहें ... या प्रति बैच संग्रह हो। –

+0

@ जोन्स स्केट इसे कॉल करने के लिए उपयोगकेस क्या होगा, यानी: आप खुद को यह कहने के लिए क्यों सीमित करेंगे, यह संग्रह बंद है? – koenmetsu

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