Два комментария - один микро, один макрос.
Во-первых, кажется, что TPL будет соответствовать вашим заявленным целям.Используя Task.Factory.StartNew()
, вы сможете создавать произвольное количество операций, которые будут выполняться в фоновых потоках.Кроме того, используя перегрузки, которые принимают CancellationToken, вы отменяете операции настолько хорошо, насколько вы можете пожелать.Обратите внимание, что задача не эквивалентна потоку - по умолчанию задачи запускаются в потоках ThreadPool (как, впрочем, и фоновые рабочие).Вполне возможно, что ваши задачи окажутся в очереди в ожидании доступности пула.
Во-вторых, более крупный комментарий.
Вы утверждаете, что у вас будет неопределенное и неопределенное числорабочих предметов.То, что вы создадите поток для каждого элемента, делает меня немного раздражительным - потоки не дешевы, и если у вас есть большое количество рабочих элементов, вы можете морить голодом свой процесс, наивно запуская новые темы.
Можете ли вы уточнитьна что нужно делать с этими темами?Я не знаю, что представляет собой рабочий элемент для вашего проекта, но вполне возможно, что настройка производителя / потребителя с фиксированным числом потоков будет соответствовать вашим потребностям распараллеливания..NET 4.0 облегчает работу с классами System.Collections.Concurrent.
РЕДАКТИРОВАТЬ в ответ на комментарий
Случай TCP-соединений очень близок к тому, о чем я думало том, когда я написал второй комментарий выше.В этом случае вы рассматриваете потенциально бесконечное потребление ограниченного ресурса ОС, а именно открытых сокетов.Я надеюсь, что вы будете расследовать неблокирующие операции ввода-вывода. Эта страница MSDN документирует асинхронное чтение из сокетов, а эта говорит о более крупной модели асинхронного программирования в .NET.
Для масштабируемого обслуживания TCP, хорошее обсуждение ужесуществует на SO: читайте в свое удовольствие .