2012-03-13 5 views

Trả lời

7

Số lượng chủ đề tối đa trong ThreadPool được đặt thành khoảng 1000 luồng trên hệ thống .NET4.0 32 bit. Nó ít hơn cho các phiên bản .NET cũ hơn. Nếu bạn có 1000 chủ đề đi, giả sử chúng đang chặn vì một số lý do, khi bạn xếp hàng tác vụ 1001st, nó sẽ không bao giờ thực thi.

Bạn sẽ không bao giờ nhấn số lượng chuỗi tối đa trong quy trình 32 bit. Hãy nhớ rằng mỗi luồng mất ít nhất 1MB bộ nhớ (đó là kích thước của ngăn xếp chế độ người dùng), cộng với bất kỳ chi phí nào khác. Bạn đã mất rất nhiều bộ nhớ từ CLR và các tệp DLL gốc được tải, vì vậy bạn sẽ nhấn một OutOfMemoryException trước khi bạn sử dụng nhiều luồng đó.

Bạn có thể thay đổi số lượng luồng mà ThreadPool có thể sử dụng, bằng cách gọi phương thức ThreadPool.SetMaxThreads. Tuy nhiên, nếu bạn muốn sử dụng nhiều chuỗi đó, bạn có một vấn đề lớn hơn với mã của mình là xa. Tôi làm NOT khuyên bạn nên gây rối với cấu hình ThreadPool như thế. Bạn sẽ chỉ có thể nhận được hiệu suất tồi tệ hơn.

Hãy nhớ với TaskThreadPool.QueueUserWorkItem, các chuỗi sẽ được sử dụng lại khi hoàn tất. Nếu bạn tạo một công việc hoặc xếp hàng một luồng threadpool, nó có thể hoặc không được tạo một chuỗi mới để thực thi mã của bạn. Nếu có sẵn các chủ đề đã có trong nhóm, nó sẽ tái sử dụng một trong những chủ đề đó thay vì tạo ra một chuỗi mới (đắt đỏ). Chỉ khi các phương thức bạn đang thực hiện trong các tác vụ không bao giờ trở lại, bạn nên lo lắng về việc chạy ra khỏi các luồng, nhưng như tôi đã nói, đó là một vấn đề hoàn toàn khác với mã của bạn.

+0

Tôi giả định chuỗi 1001 sẽ được xếp hàng đợi và được thực hiện nếu một trong các chủ đề bỏ chặn – Jon

+0

@Jon, đúng vậy. Vâng, trên một hệ thống 32-bit, bạn sẽ không thể thực hiện 1000 chủ đề mà không cần hết bộ nhớ, nhưng có, giả sử điều đó đã không xảy ra, chủ đề đó cuối cùng sẽ chạy khi một luồng được giải thoát. –

+0

+1 để biết chi tiết về mức sử dụng bộ nhớ cho mỗi chủ đề –

6

Theo mặc định, MaxThreads của ThreadPool là rất cao. Thông thường bạn sẽ không bao giờ đến đó, ứng dụng của bạn sẽ gặp sự cố trước.

Vì vậy, khi tất cả các chuỗi đang bận, nhiệm vụ mới sẽ được xếp hàng và chậm, tối đa là 1 trên 500 ms, TP sẽ phân bổ chuỗi mới.

+0

Bất kỳ cách nào để biết phần lớn thuộc tính MaxThreads là gì? – Jon

+0

Bạn gọi [ThreadPool.GetMaxThreads Method] (http://msdn.microsoft.com/en-us/library/system.threading.threadpool.getmaxthreads%28v=vs.100%29.aspx) –

4

Nó sẽ không tăng số lượng tối đa. Khi có nhiều tác vụ hơn các chuỗi công việc có sẵn, một số tác vụ sẽ được xếp hàng đợi và đợi cho đến khi nhóm luồng cung cấp một chuỗi có sẵn. Nó thực hiện một số công cụ khá tiên tiến để mở rộng với một số lượng lớn các lõi (làm việc ăn cắp, tiêm thread, vv).

+1

Nó sẽ không tăng MaxThreads. Nó chắc chắn có thể làm cho một số chủ đề mới –

+0

Rất tiếc, làm rõ. Cảm ơn. –