Trình quản lý nhóm luồng đảm bảo rằng chỉ có nhiều chuỗi được phép thực hiện khi bạn có lõi CPU. Ngay sau khi hoàn thành, một số khác đang đợi trong hàng đợi được phép thực hiện.
Hai lần một giây, nó sẽ đánh giá lại những gì đang xảy ra với các chuỗi đang chạy. Nếu họ không hoàn thành, nó giả định rằng họ đang bị chặn và cho phép một thread chờ đợi để chạy. Trên CPU hai lõi điển hình, bạn sẽ nhận được hai luồng chạy ngay lập tức, chuỗi thứ ba bắt đầu sau một giây, chuỗi thứ 4 sau 1,5 giây, v.v.
Vâng, đó là lần thứ hai của bạn. Q & D sửa chữa là sử dụng ThreadPool.SetMinThreads(), nhưng đó là giải pháp sledgehammer. Vấn đề thực sự là chương trình của bạn đang sử dụng các chủ đề nhóm luồng cho các tác vụ dài hạn. Hoặc là vì chúng thực thi nhiều mã hoặc vì chúng chặn một số yêu cầu I/O. Sau này là trường hợp phổ biến hơn.
Cách giải quyết là không sử dụng chuỗi chủ đề cho chuỗi chặn như vậy nhưng sử dụng lớp Thread thay thế. Đừng làm điều này nếu các chủ đề đang thực sự đốt chu kỳ CPU, bạn sẽ làm chậm tất cả mọi thứ xuống. Dễ hiểu, bạn sẽ thấy 100% tải CPU ở Taskmgr.exe
Nguồn
2010-08-06 15:29:54
Đây có phải là 'Control.BeginInvoke' hoặc 'Delegate.BeginInvoke' không? –
Nó đang tạo một chủ đề mới - nhưng tôi không biết phải mất bao lâu. Có lẽ rất nhanh. –
Tạo chủ đề mới tương đối đắt. –