ThreadPool.QueueUserWorkItem so với Task.Factory.StartNew


79

sự khác biệt giữa những gì dưới đây

ThreadPool.QueueUserWorkItem

vs

Task.Factory.StartNew

Nếu đoạn mã trên được gọi 500 lần cho một số tác vụ chạy dài thì điều đó có nghĩa là tất cả các luồng luồng luồng sẽ được sử dụng?

Hay TPL (tùy chọn thứ 2) sẽ đủ thông minh để chỉ chiếm số lượng luồng ít hơn hoặc bằng số bộ xử lý?

Câu trả lời:


93

Nếu bạn định bắt đầu một tác vụ dài hạn với TPL, bạn nên chỉ định TaskCreationOptions.LongRunning, điều đó có nghĩa là nó không lên lịch trên nhóm luồng. (CHỈNH SỬA: Như đã lưu ý trong phần nhận xét, đây một quyết định dành riêng cho bộ lập lịch và không phải là một đảm bảo khó và nhanh chóng, nhưng tôi hy vọng rằng bất kỳ bộ lập lịch sản xuất hợp lý nào sẽ tránh lập lịch cho 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 tự lên lịch cho một số lượng lớn các tác vụ chạy dài trên nhóm luồng. Tôi tin rằng ngày nay kích thước mặc định của nhóm luồng 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 mấu chốt của nhóm luồng là tránh các tác vụ ngắn làm mất một lượng lớn từ việc tạo một luồng 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 dù sao cũng sẽ tương đối nhỏ - và bạn không muốn kết thúc với khả năng hết luồng nhóm luồng. (Bây giờ ít khả năng xảy ra hơn, nhưng tôi đã trải nghiệm nó trên các phiên bản .NET trước đó.)

Cá nhân nếu tôi đã có tùy chọn, chắc chắn tôi muốn sử dụng TPL với lý do các TaskAPI là khá tốt đẹp - nhưng làm nhớ nói với TPL mà bạn mong đợi nhiệm vụ để chạy trong một thời gian dài.

CHỈNH SỬA: Như đã lưu ý trong nhận xét, hãy xem thêm bài đăng trên blog của nhóm PFX về việc lựa chọn giữa TPL và nhóm luồng :

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

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

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


4
Tôi cảnh giác với quy tắc nhanh khó TaskCreationOptions.LongRunningsẽ luôn tránh nhóm luồng. Nó dường như là một chỉ thị hơn là một đảm bảo thực hiện. Tôi có dựa vào đó không?
Marc

1
@Marc: Chà, đó là tùy thuộc vào bộ lập lịch - nhưng sẽ là một bộ lập lịch khá điên rồ khi lên lịch cho các tác vụ chạy dài hạn rõ ràng trên nhóm luồng, IMO.
Jon Skeet

Chỉ cần thêm một chút biết thêm - blogs.msdn.com/b/pfxteam/archive/2009/10/06/9903475.aspx
Brad Semrad

@Brad: Cảm ơn, sẽ thêm liên kết đến câu trả lời của tôi.
Jon Skeet

1
Tôi cũng muốn nói thêm rằng TPL cho phép bạn chỉ định bộ lập lịch của riêng mình, bao gồm bộ lập lịch tùy chỉnh cho phép bạn kiểm soát đồng thời của riêng mình: msdn.microsoft.com/en-us/library/ee789351.aspx
Chris Shain 8/12/12
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.