Якщо ви збираєтеся розпочати довготривале завдання з TPL, вам слід вказати TaskCreationOptions.LongRunning
, що означатиме, що воно не планує його в пулі потоків. (EDIT: Як зазначено в коментарях, це рішення, яке відповідає планувальнику, і не є жорсткою та швидкою гарантією, але я сподіваюсь, що будь-який розумний планувальник виробництва уникне планування довготривалих завдань у пулі потоків.)
Ви точно не повинні самостійно планувати велику кількість довготривалих завдань у пулі потоків. Я вважаю, що в наш час розмір типового пулу потоків є досить великим (тому що цим часто зловживають), але принципово його не слід використовувати таким чином.
Суть пулу потоків полягає у тому, щоб уникнути коротких завдань, які б не потрапили під значний удар від створення нового потоку, порівняно з часом, який вони насправді виконують. Якщо завдання буде виконуватися протягом тривалого часу, вплив створення нового потоку в будь-якому випадку буде відносно невеликим - і ви не хочете, щоб в кінцевому підсумку закінчилися потоки пулу потоків. (Це менш імовірно, але я зробив випробувати його на більш ранніх версіях .NET.)
Особисто, якби у мене була можливість, я б точно використовував TPL на тій підставі, що Task
API дуже приємний - але не забудьте сказати TPL, що ви очікуєте, що завдання буде виконуватися протягом тривалого часу.
РЕДАГУВАТИ: Як зазначається в коментарях, див. Також публікацію блогу команди PFX про вибір між TPL та пулом потоків :
На закінчення я ще раз повторю те, що розробник команди CLR ThreadPool вже заявив:
Task is now the preferred way to queue work to the thread pool.
EDIT: Також із коментарів не забувайте, що TPL дозволяє використовувати власні планувальники , якщо ви дійсно хочете ...
TaskCreationOptions.LongRunning
завжди уникатиме пулу потоків. Здається, це більше директива, ніж гарантія реалізації. Я не на базі цього?