2009-12-01 7 views
27

फ़ंक्शन के प्रकार "समर्थन के लिए लॉग जानकारी" के लिए मैं सक्रिय थ्रेड जानकारी को गणना और डंप करना चाहता हूं।.NET में वर्तमान में सक्रिय प्रबंधित थ्रेड की सूची प्राप्त करना?

मैं इस तथ्य से अच्छी तरह से अवगत हूं कि दौड़ की स्थिति इस जानकारी को अर्द्ध-गलत बना सकती है, लेकिन मैं सर्वोत्तम संभव परिणाम प्राप्त करने का प्रयास करना चाहता हूं, भले ही यह 100% सटीक न हो।

मैंने प्रक्रिया को देखा। थ्रेड, लेकिन यह प्रोसेस थ्रेड ऑब्जेक्ट्स लौटाता है, मैं थ्रेड ऑब्जेक्ट्स का संग्रह करना चाहता हूं, ताकि मैं उनका नाम लॉग कर सकूं, और वे पृष्ठभूमि धागे हैं या नहीं।

क्या ऐसा कोई संग्रह उपलब्ध है, भले ही यह सक्रिय धागे का स्नैपशॉट है जब मैं इसे कॉल करता हूं?

यानी।

Thread[] activeThreads = ?? 

ध्यान दें, स्पष्ट होना, मैं नहीं Process.Threads के बारे में पूछ रहा हूँ, इस संग्रह मुझे बहुत देता है, लेकिन मैं क्या चाहते हैं के सभी नहीं। मैं जानना चाहता हूं कि हमारे आवेदन में थ्रेड का नाम कितना समय उपयोग कर रहा है (जिसका मतलब है कि मुझे बाद में दो प्रकार की वस्तुओं को जोड़ने पर ध्यान देना होगा, लेकिन सीपीयू समय से शुरू होने के लिए नाम अधिक महत्वपूर्ण हैं।)

+0

'System.Diagnostics.ProcessThreads'' सिस्टम से सीधे संबंधित हैं। थ्रेडिंग। थ्रेड्स '? पूर्व एक ओएस धागा है, जहां उत्तरार्द्ध एक प्रबंधित धागा है। –

+1

नहीं, वे नहीं हैं। –

+0

थ्रेड क्लास से आपको कौन सी अतिरिक्त जानकारी चाहिए कि आपके पास ProcessThread क्लास में नहीं है? एक ऑपरेटिंग सिस्टम थ्रेडआईड के पास प्रबंधित थ्रेड के साथ कोई निश्चित संबंध नहीं है, क्योंकि एक अप्रबंधित होस्ट प्रबंधित और अप्रबंधित धागे के बीच संबंधों को नियंत्रित कर सकता है। विशेष रूप से, एक परिष्कृत होस्ट सीएलआर होस्टिंग एपीआई का उपयोग उसी ऑपरेटिंग सिस्टम थ्रेड के विरुद्ध कई प्रबंधित धागे को शेड्यूल करने के लिए या विभिन्न ऑपरेटिंग सिस्टम थ्रेड के बीच प्रबंधित थ्रेड को स्थानांतरित करने के लिए कर सकता है। – serhio

उत्तर

14

यदि आप अपने आवेदन के Thread अन्य रैपर वर्ग के साथ रचनाओं को प्रतिस्थापित करने के इच्छुक हैं, तो कहा गया है कि रैपर क्लास सक्रिय और निष्क्रिय Thread एस आपके लिए ट्रैक कर सकता है। यहाँ इस तरह के एक आवरण का एक न्यूनतम व्यावहारिक खोल दिया गया है:

namespace ThreadTracker 
{ 
    using System.Collections.Generic; 
    using System.Collections.ObjectModel; 
    using System.Threading; 

    public class TrackedThread 
    { 
     private static readonly IList<Thread> threadList = new List<Thread>(); 

     private readonly Thread thread; 

     private readonly ParameterizedThreadStart start1; 

     private readonly ThreadStart start2; 

     public TrackedThread(ParameterizedThreadStart start) 
     { 
      this.start1 = start; 
      this.thread = new Thread(this.StartThreadParameterized); 
      lock (threadList) 
      { 
       threadList.Add(this.thread); 
      } 
     } 

     public TrackedThread(ThreadStart start) 
     { 
      this.start2 = start; 
      this.thread = new Thread(this.StartThread); 
      lock (threadList) 
      { 
       threadList.Add(this.thread); 
      } 
     } 

     public TrackedThread(ParameterizedThreadStart start, int maxStackSize) 
     { 
      this.start1 = start; 
      this.thread = new Thread(this.StartThreadParameterized, maxStackSize); 
      lock (threadList) 
      { 
       threadList.Add(this.thread); 
      } 
     } 

     public TrackedThread(ThreadStart start, int maxStackSize) 
     { 
      this.start2 = start; 
      this.thread = new Thread(this.StartThread, maxStackSize); 
      lock (threadList) 
      { 
       threadList.Add(this.thread); 
      } 
     } 

     public static int Count 
     { 
      get 
      { 
       lock (threadList) 
       { 
        return threadList.Count; 
       } 
      } 
     } 

     public static IEnumerable<Thread> ThreadList 
     { 
      get 
      { 
       lock (threadList) 
       { 
        return new ReadOnlyCollection<Thread>(threadList); 
       } 
      } 
     } 

     // either: (a) expose the thread object itself via a property or, 
     // (b) expose the other Thread public methods you need to replicate. 
     // This example uses (a). 
     public Thread Thread 
     { 
      get 
      { 
       return this.thread; 
      } 
     } 

     private void StartThreadParameterized(object obj) 
     { 
      try 
      { 
       this.start1(obj); 
      } 
      finally 
      { 
       lock (threadList) 
       { 
        threadList.Remove(this.thread); 
       } 
      } 
     } 

     private void StartThread() 
     { 
      try 
      { 
       this.start2(); 
      } 
      finally 
      { 
       lock (threadList) 
       { 
        threadList.Remove(this.thread); 
       } 
      } 
     } 
    } 
} 

और इसके बारे में एक त्वरित परीक्षण ड्राइवर (ध्यान दें मैं धागे की सूची पर पुनरावृति नहीं है, केवल सूची में संख्या प्राप्त):

namespace ThreadTracker 
{ 
    using System; 
    using System.Threading; 

    internal static class Program 
    { 
     private static void Main() 
     { 
      var thread1 = new TrackedThread(DoNothingForFiveSeconds); 
      var thread2 = new TrackedThread(DoNothingForTenSeconds); 
      var thread3 = new TrackedThread(DoNothingForSomeTime); 

      thread1.Thread.Start(); 
      thread2.Thread.Start(); 
      thread3.Thread.Start(15); 
      while (TrackedThread.Count > 0) 
      { 
       Console.WriteLine(TrackedThread.Count); 
      } 

      Console.ReadLine(); 
     } 

     private static void DoNothingForFiveSeconds() 
     { 
      Thread.Sleep(5000); 
     } 

     private static void DoNothingForTenSeconds() 
     { 
      Thread.Sleep(10000); 
     } 

     private static void DoNothingForSomeTime(object seconds) 
     { 
      Thread.Sleep(1000 * (int)seconds); 
     } 
    } 
} 

सुनिश्चित नहीं है कि आप इस तरह के मार्ग पर जा सकते हैं, लेकिन यदि आप विकास के शुरुआती चरण में शामिल करने में सक्षम हैं तो यह लक्ष्य पूरा करेगा।

+0

धन्यवाद, ऐसा लगता है कि यह वह मार्ग है जिसका उपयोग मुझे करना होगा। –

3

क्या आप अपने आवेदन में प्रत्येक थ्रेड बनाते समय थ्रेड जानकारी को लुकअप में संग्रहीत करना संभव है?

प्रत्येक धागा शुरू होने के बाद, आप AppDomain.GetCurrentThreadId() का उपयोग कर अपना आईडी प्राप्त कर सकते हैं। बाद में, आप इसका उपयोग Process.Threads से लौटाए गए डेटा के संदर्भ में पार करने के लिए कर सकते हैं।

+1

ठीक है, ऐसा लगता है कि मुझे ऐसा करना है, लेकिन मैं नहीं चाहता। –

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