2010-08-13 20 views
30

Chương trình đơn giản này bắt đầu với 15 luồng - theo số lượng. Đôi khi trong suốt cuộc đời của nó nó giảm xuống một vài, nhưng họ trở lại.Tại sao ứng dụng giao diện điều khiển .NET đơn giản này lại có quá nhiều luồng?

class Program 
{ 
    static void Main(string[] args) 
    { 
     while (true) 
     { 
      Console.WriteLine(Process.GetCurrentProcess().Threads.Count); 
      Thread.Sleep(500); 
     } 
    } 
} 

Tôi đã chờ đợi quá trình này chỉ có một thread (và trực giác của tôi đã được sao lưu bởi this)

Nếu không có trình gỡ lỗi, quá trình này chỉ có (!) 4 chủ đề. Chắc chắn mọi thứ CLR sẽ bị ẩn khỏi quá trình của tôi?

Số lượng này là bao nhiêu? Liệu quá trình thực sự có nhiều chủ đề? Tại sao?

+0

Bạn có bao nhiêu? –

+0

chỉ vì tò mò - tôi làm gì ở đây? tất cả mọi người đều có cùng một câu trả lời: D – obelix

+1

@obelix: nếu tất cả đều xứng đáng là một upvote, bạn có thể upvote tất cả. Loại câu hỏi của bạn nên được hỏi về MSO. – Richard

Trả lời

35

Hãy thử chạy nó bên ngoài trình gỡ lỗi (nghĩa là nhấn Ctrl + F5 thay vì F5). Bạn chỉ nên xem ba chủ đề - chủ đề chính, chủ đề GC & chuỗi kết thúc IIRC. Các chủ đề khác mà bạn thấy là các chuỗi liên quan đến trình gỡ lỗi.

+0

Có, chủ đề chính, GC và finalizer là chính xác những gì bạn sẽ thấy. Tuy nhiên bạn cần phải A) chạy bên ngoài trình gỡ lỗi và B) tắt Visual Studio Hosting Process mà thêm một hoặc hai thread. – Tergiver

+0

bạn có liên kết đến một bài viết msdn không? –

+1

là quá trình lưu trữ VS được kích hoạt ngay cả khi tôi đang ở chế độ Phát hành mà không cần chạy quá trình thông qua VS? Tôi vẫn thấy 4 chủ đề ... –

5

Nếu bạn chạy nó mà không có trình gỡ rối được đính kèm, sẽ có ít chuỗi hơn đáng kể. Và những người có lẽ sẽ là chủ đề finalizer, và các công cụ CLR giữ nhà khác.

4

Thử chạy nó mà không cần trình gỡ lỗi (Visual Studio) được đính kèm (Ctrl + F5). Bạn sẽ thấy rằng sẽ có ít hơn (có thể 3) chủ đề. Hầu hết các chủ đề đó phải làm với trình gỡ lỗi.

5

Dự án + Thuộc tính, Gỡ lỗi, bỏ chọn "Bật quy trình lưu trữ Visual Studio". Tôi không thể phát hiện ra nó đang làm gì. Ngay sau khi tôi đánh dấu vào tùy chọn "Đã gỡ lỗi mã không được quản lý" để thử xem nhanh các chủ đề này, chúng không còn bắt đầu nữa. Không có đầu mối. Nhưng tôi chắc chắn đó là vì lợi ích của chúng tôi :)

+1

Tôi nghĩ rằng quá trình lưu trữ cung cấp cho trình gỡ lỗi đi sọc nhanh hơn, hoặc một cái gì đó như thế. –

+1

Tôi tin rằng quy trình lưu trữ được thiết kế để cung cấp thời gian khởi động nhanh hơn để gỡ lỗi - khi bạn gỡ lỗi, các hội đồng có liên quan được tải vào quy trình vshost, thay vì trình gỡ lỗi phải tiếp tục tạo/hủy các quy trình mới. –

+2

Không, quy trình lưu trữ là phiên bản được lưu trữ tùy chỉnh của CLR. Chủ yếu vì mục đích bảo mật. –

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