2009-04-17 28 views
19

Tôi đã tạo ứng dụng bảng điều khiển trong C# với một tuyên bố đơn Console.ReadLine. Chạy ứng dụng này trong Visual Studio và bước vào trình gỡ rối cho thấy 7 chủ đề trong cửa sổ chủ đề (6 chủ đề công nhân, một là .NET SystemEvents và một là vshost.RunParkingWindow và chủ đề chính).Tại sao có 3 luồng cho một ứng dụng giao diện điều khiển C# đơn lẻ cơ bản?

Khi tôi chạy ứng dụng bên ngoài Visual Studio, tôi thấy tổng cộng 3 luồng trong trình quản lý tác vụ Windows. Tại sao rất nhiều khi tôi mong đợi 1 sợi? Những người khác được sinh ra để làm gì?

+0

Tôi giả sử thực thi thời gian chạy .NET là những gì chúng đang thực hiện, nhưng tôi không thể trả lại xác nhận đó với bất kỳ kiến ​​thức cụ thể nào. –

Trả lời

36

Nếu bạn đang chạy ứng dụng .NET, tôi tin rằng bạn luôn nhận được một chủ đề (chủ yếu là ngủ) cho JIT (trình biên dịch trong thời gian) cũng như luồng GC (Garbage Collection), ngoài chủ đề chính của bạn.

1

Đừng quên rằng chuỗi trình hoàn thiện!

+0

Không có thứ gì như là một chuỗi kết thúc; tuy nhiên, có một chủ đề GC. – Samuel

+1

@Samuel: tên đầy đủ là trong thực tế, GC Finalizer Thread, hoặc ít nhất đó là những gì google dường như nói. Câu trả lời được chấp nhận đã được chỉnh sửa trong khung thời gian ban đầu 5mn để thêm GC, mà nó không có trong phiên bản gốc của nó, do đó câu trả lời của tôi. – Brann

+0

Uh, vâng có một trình hoàn thiện. Nó chạy ở mức ưu tiên thấp trong nền để xử lý một hàng đợi mà GC thiết lập. Bản thân GC không nhất thiết phải chạy trong một chuỗi riêng biệt từ ứng dụng của bạn. – Promit

3

Có một cách để di chuyển SystemEvents notifier vào chủ đề của bạn:

public static class ThreadingHelper_NativeMethods 
{ 
    [DllImport("user32.dll")] 
    public static extern bool IsGUIThread(bool bConvert); 
} 


    // This code forces initialization of .NET BroadcastEventWindow to the UI thread. 
    // http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/fb267827-1765-4bd9-ae2f-0abbd5a2ae22 
    if (ThreadingHelper_NativeMethods.IsGUIThread(false)) 
    { 
     Microsoft.Win32.SystemEvents.InvokeOnEventsThread(new MethodInvoker(delegate() 
     { 
      int x = 0; 
     })); 
    } 
5

Bạn không cần phải lo lắng: Nếu bạn không sử dụng chúng một cách rõ ràng, bạn sẽ không có bất kỳ mã của bạn đang chạy trong một chỉ hơn chủ đề chính. Các chủ đề khác cho:

  • thu rác
  • Quyết toán
  • ThreadPool

Làm 3 bài chia sẻ một stdin?

Theorethically có, nhưng những người khác sẽ không sử dụng nó, trừ khi bạn sử dụng Console.ReadLine bên trong một destructor hoặc bên ThreadPool.QueueUserWorkItem, vì vậy đừng lo lắng, bạn sẽ nhận được tất cả dữ liệu trong chủ đề chính

1

Nếu bạn đã không thực hiện bất kỳ luồng hoặc công việc luồng nào, chỉ sau đó một trong những chủ đề đó là của bạn. Phần còn lại được tạo bởi thời gian chạy và các thư viện của nó, ví dụ: thu gom rác thải. Số lượng chủ đề sẽ khác nhau tùy thuộc vào thư viện bạn sử dụng, số lượng lõi, v.v.

Các chủ đề đó có thể chia sẻ ngữ cảnh, ví dụ: Console, nhưng bạn chỉ cần lo lắng về việc đồng bộ hóa các chủ đề và cấu trúc của riêng mình.

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