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 là 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 Task
API 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 ...
TaskCreationOptions.LongRunning
sẽ 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?