मैं क्या मुझे लगता है एक बहुत आम सूत्रण परिदृश्य है:थ्रेड कतार
- मैं पूरा करने के लिए
- सभी नौकरियों प्रत्येक अन्य
- मैं कार्रवाई करने के लिए चाहते हैं पर निर्भर नहीं हैं 100 समान नौकरी एक समय
- हर काम पूर्ण कर देती है पर 15 नौकरियों की एक अधिकतम, एक नया काम शुरू कर दिया किया जाएगा जब तक सभी नौकरियों पूरी हो चुकी हैं
यदि आप मानते हैं कि प्रत्येक कार्य पूरा होने पर एक घटना को आग लग जाएगा (मैं पृष्ठभूमिवर्कर वर्ग का उपयोग कर रहा हूं), मैं इसे खींचने के कुछ तरीकों के बारे में सोच सकता हूं, लेकिन मुझे यकीन नहीं है कि " सही "समाधान है। मैं उम्मीद कर रहा था कि आप में से कुछ गुरुओं को सही दिशा में इंगित कर सकते हैं।
समाधान 1:है (जारी रखें) {थ्रेडिंग। नींद (1000); } मेरे मुख्य() फ़ंक्शन में लूप। Job_Completed ईवेंट हैंडलर में कोड जारी रहेगा = झूठी ए) कोई नौकरियां कतारबद्ध नहीं रहती हैं और बी) सभी कतारबद्ध नौकरियां पूरी हो चुकी हैं। मैंने पहले इस समाधान का उपयोग किया है और ऐसा लगता है कि यह ठीक काम करता है ... यह मेरे लिए थोड़ा "अजीब" लगता है।
समाधान 2: मेरे मुख्य() फ़ंक्शन में एप्लिकेशन का उपयोग करें।()। इसी तरह, Job_Completed ईवेंट हैंडलर में कोड एप्लिकेशन.एक्सिट() को कॉल करेगा जब ए) कोई नौकरियां कतारबद्ध नहीं रहेंगी और बी) सभी कतारबद्ध नौकरियां पूरी हो चुकी हैं।
समाधान 3: एक ThreadPool का उपयोग करें, सभी 500-1000 अनुरोध अप कतार, उन्हें एक समय (SetMaxThreads) में 10 चलाने के लिए और किसी भी तरह पूरा करने के लिए उन सब को के लिए प्रतीक्षा करते हैं।
इन सभी समाधानों में, मूल विचार यह है कि जब तक कोई नौकरी नहीं छोड़ी जाती, तब तक एक और नौकरी पूरी होने पर एक नई नौकरी शुरू की जाएगी। इसलिए, समस्या न केवल मौजूदा नौकरियों को पूरा करने की प्रतीक्षा कर रही है, बल्कि तब तक प्रतीक्षा कर रही है जब तक कि कोई लंबित नौकरियां शुरू नहीं हो जातीं। यदि थ्रेडपूल सही समाधान है, तो सभी कतारबद्ध वस्तुओं को पूरा करने के लिए थ्रेडपूल पर प्रतीक्षा करने का सही तरीका क्या है?
मुझे लगता है कि मेरा ओवरराइडिंग भ्रम यहां है कि मुझे समझ में नहीं आता कि कैसे मेरे मुख्य() फ़ंक्शन के भीतर से ईवेंट कैसे आग लगने में सक्षम हैं। जाहिर है, वे करते हैं, मैं बस विंडोज मैसेज लूप पॉइंट-ऑफ-व्यू से मैकेनिक्स को समझ नहीं पा रहा हूं। इस समस्या को हल करने का सही तरीका क्या है, और क्यों?
यह थ्रेडपूल शैली समाधान के आसपास सबसे अधिक सुझाव केंद्र जैसा लगता है ... मेरे प्रस्तावित समाधान 1 और समाधान 2 के बारे में क्या है (मूल रूप से निकाली जाने वाली किसी घटना द्वारा संशोधित होने वाली स्थिति पर प्रतीक्षा करना)? क्या ऐसा कुछ भी करने में स्वाभाविक रूप से गलत है, या यह है कि .NET थ्रेडपूल प्रदान करता है, इसलिए यह आवश्यक नहीं है? ऐसा लगता है कि इस तरह कोड होना अजीब लगता है: जबकि (जारी रखें) थ्रेडिंग। नींद (1000); ... मुख्य() फ़ंक्शन में ईवेंट को आग लगने का इंतजार करते समय। इस तरह के कोड में ... जब मेरी घटनाओं को ठीक से संभाला जाता है ... कहीं सोते हैं() कॉल? –