2014-06-06 4 views
7

से नाम से थ्रेड चलाना स्टैक ओवरफ़्लो प्रश्नों और कुछ googling पर खोज करने के बाद, मुझे अभी भी यह नहीं मिल रहा है।प्रक्रिया थ्रेडकोलेक्शन

मुझे पता है कि आप "थ्रेड.इसएलीव()" विधि के साथ एक थ्रेड चल रहा है या नहीं, लेकिन मैं यह जांचना चाहता हूं कि वर्तमान प्रक्रिया से सभी चल रहे थ्रेड के बीच कोई विशेष "FooThread" चल रहा है या नहीं, और यदि नहीं, तो उस विधि को कॉल करें जो इसे शुरू करता है।

//somewhere in the code, on another Project/DLL inside solution 
private void FooThreadCaller() 
{ 
    Action act =() => fooFunction(); 
    Thread t = new Thread(new ThreadStart(act)); 
    t.Name = "FooThread"; 
    t.Start(); 
} 
//... 
Process proc = System.Diagnostics.Process.GetCurrentProcess(); 
ProcessThreadCollection threads = proc.Threads; 
bool ThreadExists = false 
foreach (ProcessThread item in threads) 
{ 
    // if item.Name == "FooThread", then ThreadExists = true... 
    // so, if !ThreadExists then call FooThreadCaller() and so on. 
} 
//... 

के बाद से ProcessThread वर्ग एक "नाम" संपत्ति (System.Threading.Thread करता है) की तरह नहीं है, लेकिन केवल आईडी, और मैं केवल धागा नाम पता ("FooThread ") आईडी नहीं, मैं कैसे जांच सकता हूं कि" फू थ्रेड "चल रहा है या जिंदा है?

अग्रिम में धन्यवाद

+1

भले ही यह संभव था, यह एक अच्छा विचार नहीं होगा। अगर थ्रेड बस बाहर निकलने की प्रक्रिया में था तो आप इसे अभी भी चलने के रूप में समझेंगे। यह स्वाभाविक रूप से कठोर है। इस जानकारी को स्वयं ट्रैक करें। जब फूश्रेड बंद हो जाता है, तो नहीं। जब यह शुरू होता है, तो ध्यान दें। – usr

+2

आप कुछ बहुत ही गलत कर रहे हैं। कोई भी "थ्रेड अभी भी चल रहा परीक्षण है" बेकार है, हो सकता है कि यह बाद में नैनोसेकंड नहीं चला रहा हो। अच्छी बात यह काम नहीं करती है। –

+2

ये बहुत अच्छी टिप्पणियां हैं, लेकिन यह भी ध्यान देने योग्य है कि ओपी वास्तव में यह देखने के लिए जांच कर रहा है कि थ्रेड * नहीं चल रहा है या नहीं। – Slider345

उत्तर

5

जैसा कि अन्य उत्तरों में बताया गया है, प्रक्रिया थ्रेड और थ्रेड ऑब्जेक्ट अलग हैं। आपका डीएलएल अपनी खुद की थ्रेड ऑब्जेक्ट बना रहा है, लेकिन फिर यह उस ऑब्जेक्ट के संदर्भ को फेंक देता है। फिर बाद में आप उस थ्रेड के लिए ओएस (System.Diagnostics के माध्यम से) से पूछताछ कर रहे हैं और थ्रेड के निर्माता के रूप में आपके पहले पहुंच के समान स्तर की अपेक्षा करते हैं।

इसके बजाय, आपको अपने थ्रेड ऑब्जेक्ट्स के संदर्भों को सहेजने के बाद संदर्भों को सहेजना चाहिए। हो सकता है कि आपका डीएल एक सार्वजनिक स्थैतिक संग्रह ऑब्जेक्ट को कार्यान्वित कर सके जो आप अपनी थ्रेड ऑब्जेक्ट्स को तब बनाते हैं जब आप उन्हें बनाते हैं।

फिर अपने डीएल के बाहर आप संग्रह के माध्यम से लूप कर सकते हैं और प्रत्येक थ्रेड के नाम और स्थिति की जांच कर सकते हैं।

+1

धन्यवाद @ स्लाइडर 345। मैं इसे देख लूंगा। –

2

मुझे नहीं लगता कि ऐसा करने का कोई तरीका है। ProcessThreadओएस धागा का प्रतिनिधित्व करता है। Thread आपके आवेदन के अंदर प्रबंधित धागा का प्रतिनिधित्व करता है। वास्तव में दोनों के बीच एक रिश्ता नहीं है। इसके अलावा, Thread और ProcessThread का मैपिंग 1: 1 नहीं है, जैसा कि ProcessThread एकाधिक Thread एस का प्रतिनिधित्व कर सकता है।

3

ProcessThread एक ऑपरेटिंग सिस्टम-स्तर धागा का प्रतिनिधित्व करता है, जबकि Thread एक .NET प्रबंधित थ्रेड का प्रतिनिधित्व करता है। एक ऑपरेटिंग सिस्टम-स्तरीय धागे का नाम नहीं है लेकिन एक अद्वितीय आईडी (बस एक प्रक्रिया की तरह)।

यदि आपका धागा अभी भी चल रहा है, तो मौजूदा थ्रेड की सूची में जांच करने के बजाय, आपको शायद अपने कोड का तर्क बदलना चाहिए। उदाहरण के लिए, आप अपने थ्रेड की स्थिति वाले बुलियन को रख सकते हैं और इसे शुरू/समाप्त होने पर अपडेट कर सकते हैं।

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