2010-12-10 9 views
6

मैं ThreadPool का उपयोग कर रहामैं कैसे ThreadPool में आइटमों की संख्या का निर्धारण कर सकता कतार

While(reading in data for processing) 
{ 
    args = some data that has been read; 
    ThreadPool.QueueUserWorkItem(new WaitCallback(threadRunner), args); 
} 

यह बहुत अच्छी तरह से काम कर रहे 1000 workitems के क़तार में, हालांकि, के रूप में मुख्य थ्रेड अनुरोध तेजी से वे कर रहे हैं कतार संसाधित स्मृति धीरे-धीरे खाया जाता है।

मैं कतार रुके निम्नलिखित कुछ के सदृश करना पसंद के रूप में कतार बढ़ता

Thread.Sleep(numberOfItemsCurrentlyQueued); 

यह लंबे समय तक प्रतीक्षा करता है में परिणाम होगा के रूप में कतार बढ़ता जाएगा।

क्या यह पता लगाने का कोई तरीका है कि कतार में कितने आइटम हैं?

उत्तर

2

मुझे नहीं लगता कि एक अंतर्निहित तरीका है, लेकिन आप एक [स्थिर?] काउंटर पेश कर सकते हैं जो बढ़ेगा/घट जाएगा; इसके लिए आपको अपनी खुद की विधि बनाना होगा जो ThreadPool.QueueUserWorkItem() को लपेटेगा और काउंटर का ख्याल रखेगा।

वैसे, अगर आप .NET 4.0 चला रहे हैं, तो आपको ThreadPactory.QueueUserWorkItem() के बजाय TaskFactory.StartNew का उपयोग करना चाहिए - यह बेहतर स्मृति/थ्रेड प्रबंधन कहता है।

4

निर्माता/उपभोक्ता कतार के लिए एक अधिक प्रबंधनीय अमूर्त BlockingCollection<T> है। उदाहरण कोड में दिखाया गया है कि कैसे बीज को कार्य का उपयोग करना और कतार को निकालना है। कतार गणना Count संपत्ति के माध्यम से आसानी से उपलब्ध है।

यदि आप कर सकते हैं, तो अधिक आइटमों के उत्पादन में देरी के लिए Sleep का उपयोग करने से बचें। निर्माता को किसी इवेंट या इसी तरह की प्रतीक्षा करें जब कतार बहुत बड़ी हो, और उपभोक्ता (ओं) घटना को सिग्नल कर लेते हैं जब कतार बैकलॉग एक थ्रेसहोल्ड तक पहुंच जाता है जहां आप अधिक वस्तुओं को उत्पादित करने में सहज महसूस करते हैं। हमेशा ईवेंट-संचालित चीजों को बनाने का प्रयास करें - Sleep अनुमान का थोड़ा सा है।

+0

मैंने एंड्री द्वारा दिए गए उत्तर को स्वीकार कर लिया है क्योंकि उन्होंने प्रश्न शीर्षक का जवाब दिया "मैं थ्रेडपूल कतार में वस्तुओं की संख्या कैसे निर्धारित कर सकता हूं?" हालांकि आपका जवाब मेरे लिए सबसे उपयोगी है, इस समाधान को साझा करने के लिए धन्यवाद। – Perrin255

+0

खुशी है कि यह सहायक है। सौभाग्य। –

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