2012-02-08 7 views
68

chênh lệch giữa bên dướiThreadPool.QueueUserWorkItem vs Task.Factory.StartNew

ThreadPool.QueueUserWorkItem 

vs

Task.Factory.StartNew 

là gì Nếu đoạn mã trên được gọi là 500 lần đối với một số nhiệm vụ dài chạy có nghĩa là tất cả thread thread thread sẽ được đưa lên?

Hoặc TPL (tùy chọn thứ 2) có đủ thông minh để chỉ nhận các chuỗi ít hơn hoặc bằng số bộ vi xử lý không?

Trả lời

84

Nếu bạn định bắt đầu nhiệm vụ dài hạn với TPL, bạn nên chỉ định TaskCreationOptions.LongRunning, điều này có nghĩa là không phải là lên lịch trên nhóm chủ đề. (EDIT: Như đã lưu ý trong phần nhận xét này, quyết định lên lịch cụ thể và không phải là đảm bảo cứng và nhanh, nhưng tôi hy vọng rằng bất kỳ lập lịch sản xuất hợp lý nào cũng sẽ tránh lập lịch các tác vụ chạy dài trên một nhóm luồng.)

Bạn chắc chắn không nên lên lịch cho một số lượng lớn các tác vụ dài hạn trên chính hồ bơi. Tôi tin rằng những ngày này kích thước mặc định của các hồ bơi thread là khá lớn (vì nó thường bị lạm dụng theo cách này) nhưng về cơ bản nó không nên được sử dụng như thế này.

Điểm của hồ bơi chuỗi là để tránh ngắn các tác vụ thực hiện một lần truy cập lớn từ việc tạo chuỗi mới, so với thời gian chúng thực sự đang chạy. Nếu tác vụ sẽ chạy trong một thời gian dài, tác động của việc tạo một luồng mới sẽ tương đối nhỏ - và bạn không muốn kết thúc khả năng chạy ra khỏi các luồng của luồng chủ đề. (Hiện tại ít có khả năng hơn, nhưng tôi đã làm trải nghiệm nó trên các phiên bản .NET cũ hơn.)

Cá nhân nếu tôi có tùy chọn, tôi chắc chắn sẽ sử dụng TPL với lý do là API Task là khá hay - nhưng do hãy nhớ nói với TPL rằng bạn mong đợi nhiệm vụ chạy trong một thời gian dài.

EDIT: Như đã nêu trong các ý kiến, xem thêm bài đăng blog đội PFX về choosing between the TPL and the thread pool:

Tóm lại, tôi sẽ nhắc lại những gì nhà phát triển ThreadPool đội CLR của đã tuyên bố:

Task is now the preferred way to queue work to the thread pool. 

CHỈNH SỬA: Cũng từ nhận xét, đừng quên rằng TPL cho phép bạn sử dụng custom schedulers, nếu bạn thực sự muốn ...

+4

Tôi cảnh giác với tốc độ nhanh quy tắc rằng 'TaskCreationOptions.LongRunning' sẽ luôn tránh thread-pool. Nó có vẻ là một chỉ thị hơn là bảo đảm thực hiện. Tôi có căn cứ vào điều đó không? – Marc

+1

@Marc: Vâng, nó phụ thuộc vào lịch trình - nhưng nó sẽ là một bộ lập kế hoạch khá điên rồ để lên lịch các nhiệm vụ dài hạn rõ ràng trên nhóm luồng, IMO. –

+0

Chỉ cần thêm một chút thông tin - http://blogs.msdn.com/b/pfxteam/archive/2009/10/06/9903475.aspx –