2009-12-01 28 views
27

Đối với một loại "thông tin đăng nhập để hỗ trợ" loại chức năng tôi muốn liệt kê và đổ thông tin chủ đề hoạt động.Lấy danh sách các chuỗi được quản lý hiện đang hoạt động trong .NET?

Tôi nhận thức được thực tế rằng điều kiện chủng tộc có thể làm cho thông tin này không chính xác, nhưng tôi muốn cố gắng đạt được kết quả tốt nhất có thể, ngay cả khi nó không chính xác 100%.

Tôi đã xem Process.Threads, nhưng nó trả về các đối tượng ProcessThread, tôi muốn có một bộ sưu tập các đối tượng Thread, để tôi có thể đăng nhập tên của chúng và chúng có phải là các chủ đề nền hay không.

Có bộ sưu tập như vậy không, ngay cả khi nó chỉ là ảnh chụp nhanh của các chuỗi đang hoạt động khi tôi gọi nó?

tức là.

Thread[] activeThreads = ?? 

Lưu ý, để được rõ ràng, tôi không hỏi về Process.Threads, bộ sưu tập này mang lại cho tôi rất nhiều, nhưng không phải tất cả những gì tôi muốn. Tôi muốn biết bao nhiêu thời gian cụ thể được đặt tên trong ứng dụng của chúng tôi hiện đang sử dụng (có nghĩa là tôi sẽ phải xem xét kết nối hai loại đối tượng sau đó, nhưng tên là quan trọng hơn thời gian CPU để bắt đầu.)

+0

'System.Diagnostics.ProcessThreads' có thể tương thích trực tiếp với' System.Threading.Threads' không? Trước đây là một chuỗi hệ điều hành, nơi mà sau này là một sợi được quản lý. –

+1

Không, không phải. –

+0

Thông tin bổ sung nào từ lớp Thread bạn cần là bạn không có trong lớp ProcessThread? ThreadId hệ điều hành không có mối quan hệ cố định với chuỗi được quản lý, bởi vì một máy chủ không được quản lý có thể kiểm soát mối quan hệ giữa các luồng được quản lý và không được quản lý. Cụ thể, một máy chủ tinh vi có thể sử dụng CLR Hosting API để lên lịch cho nhiều luồng được quản lý dựa trên cùng một luồng hệ điều hành hoặc để di chuyển một chuỗi được quản lý giữa các luồng hệ điều hành khác nhau. – serhio

Trả lời

14

Nếu bạn sẵn sàng thay thế các ứng dụng Thread của ứng dụng bằng lớp trình bao bọc khác, lớp trình bao bọc có thể theo dõi số Thread s hoạt động và không hoạt động cho bạn. Dưới đây là một lớp vỏ tối thiểu khả thi của một wrapper như:

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); 
       } 
      } 
     } 
    } 
} 

và một người lái xe thử nghiệm nhanh của nó (lưu ý tôi không lặp trên danh sách các chủ đề, chỉ lấy số liệu trong danh sách):

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); 
     } 
    } 
} 

Không chắc chắn nếu bạn có thể đi một lộ trình như vậy, nhưng nó sẽ hoàn thành mục tiêu nếu bạn có thể kết hợp ở giai đoạn phát triển ban đầu.

+0

Cảm ơn, có vẻ như đây là tuyến đường tôi sẽ phải sử dụng. –

3

Có khả thi để bạn lưu trữ thông tin luồng trong một tra cứu khi bạn tạo mỗi luồng trong ứng dụng của mình không?

Khi mỗi chuỗi bắt đầu, bạn có thể nhận ID của nó bằng cách sử dụng AppDomain.GetCurrentThreadId(). Sau đó, bạn có thể sử dụng điều này để tham chiếu chéo với dữ liệu được trả lại từ Process.Threads.

+1

Vâng, đó là những gì nó trông giống như tôi phải làm, nhưng tôi không muốn. –

Các vấn đề liên quan