2010-05-14 13 views
10

मैंने धागे की एक सरणी बनाई है और उन सभी को शुरू किया है। कैसे पता चलेगा कि सभी धागे काम पूरा कर चुके हैं या नहीं। मैं thread.wait या thread.join का उपयोग नहीं करना चाहता।थ्रेड के एक ऐरे को पूरा करने का पता लगाने

उत्तर

2

ठीक है, आप परीक्षण Thread.IsAlive परीक्षण कर सकते हैं - लेकिन जैसे ही आपने इसका परीक्षण किया है, उतना ही पुराना हो जाएगा। आप "वर्तमान में जिंदा" धागे की एक सूची रख सकते हैं, और जब वे रुकते हैं, तो परीक्षण रनों के बीच सोते समय उन्हें हटा दें। अधिक विस्तृत जानकारी के लिए आप Thread.ThreadState का उपयोग कर सकते हैं।

यहां बड़ी तस्वीर क्या है? आप क्या हासिल करने की कोशिश कर रहे हैं, और आप Thread.Join (संभावित रूप से टाइमआउट के साथ) क्यों नहीं कॉल करना चाहते हैं?

4

यदि आप .NET 4 का उपयोग कर रहे हैं तो आप Task Parallel Library और ContinueWhenAll विधि का उपयोग कर सकते हैं।

आपको Task के रूप में प्रतिनिधित्व करने के लिए अपने धागे को संशोधित करना होगा। कार्य तब धागे के साथ काम करना आसान है। आम तौर पर आपको निचले स्तर की चीजों के बारे में चिंता करने की ज़रूरत नहीं है क्योंकि आपको शेड्यूलिंग या चीजों को पूरा करने की प्रतीक्षा करने के लिए मजबूर होना पड़ता है।

-1

किस अंत तक? निदान? Console.WriteLine।

यदि नहीं, तो वैश्विक चर (जैसे: सभी धागे तक पहुंच योग्य) का उपयोग करें, जब आपके धागे में से एक शुरू होता है, तब यह बढ़ता है जब यह समाप्त होता है। यदि 0, सभी धागे ने काम पूरा कर लिया है, लेकिन आपको इसे सही तरीके से सिंक्रनाइज़ करने के लिए सावधान रहना चाहिए अन्यथा आपको झूठी सकारात्मक चीज़ें मिलेंगी। आप शुरू के बाद आप धागे एक कार्य करें:

while (runningThreadsCount > 0) 
{ 
    // There are still working threads 
} 
+0

में रद्द कर दिया गया गुण आप सभी आपकी मदद के लिए धन्यवाद। मैंने थ्रेडकाउंट का इस्तेमाल किया और यह मेरी समस्या हल हो गई। मैंने लूप के दौरान किया था: { कंसोल। राइटलाइन ("धागे की संख्या: {0}", ImageCompute.threadCount); } जबकि (! (ImageCompute.threadCount == 0)); लेकिन, यह धागे की संख्या गिनने की तरह है। लेकिन क्या हमारे पास कॉलबैक फ़ंक्शंस की तरह कुछ है। एक बार पूरा होने के बाद हम प्रत्येक थ्रेड और ट्रिगर को संलग्न कर सकते हैं। एक बार फिर धन्यवाद। – Harsha

+0

यह दृष्टिकोण दौड़ की स्थिति के लिए प्रवण है क्योंकि एक पूर्णांक में वृद्धि और कमी एक परमाणु संचालन नहीं है (इसमें एक पढ़ना और लिखना शामिल है)। दो धागे एक ही मूल्य को पढ़ सकते हैं, इसे कम कर सकते हैं और इसे वापस लिख सकते हैं, चलने के कारण थ्रेड्स काउंटर कभी नहीं बनने के लिए 0. –

+0

@ हरशा यदि आप थ्रेड समाप्त होने पर लगातार काम करना चाहते हैं, तो टास्क समांतर लाइब्रेरी पर एक नज़र डालें (मेरी जांच करें जवाब देने के)। –

0

क्या MyThread.ThreadState == System.Threading.ThreadState.Stopped के बारे में?

+0

यह होना चाहिए '(MyThread.ThreadState और System.Threading.ThreadState.Stopped) == सिस्टम। थ्रेडिंग। थ्रेडस्टेट।'थ्रेडस्टेट' में फ्लैगएट्रिब्यूट के बाद से रोक दिया गया है और इस प्रकार अधिक मूल्य "हो सकता है"। – Patrick

0

आप किसी सरणी के बजाय थ्रेडपूल क्लास का उपयोग कर सकते हैं, और यह जांचने के लिए 'GetAvailableThreads' विधि का उपयोग कर सकते हैं कि सभी थ्रेड उपलब्ध हैं या नहीं। देखें:

ThreadPool class

0

धागे वापस वर्ग है कि आप उन्हें शुरू करने के लिए फोन में संकेत करने के लिए है कि वे

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