Задачи в пуле потоков не должны блокироваться.В то время как в .NET 4.0 была проделана работа по его поддержке, Threadpool на самом деле не предназначен для длительных задач и, конечно, не предназначен для операций, которые блокируют (эмпирическое правило, если время запуска потока незначительно для времени, затрачиваемого назадача, тогда вам лучше раскрутить свою нить).
Если вам кажется, что вы пытаетесь это сделать, вам может быть лучше с IObservable
.Взгляните на Rx (Reactive) Extensions для некоторых действительно интересных вещей, которые вы можете сделать с помощью IObservable.По умолчанию IObservable обрабатывает только один запрос за раз, но вы можете легко взять каждый объект по мере его отправки и выбросить его в пул потоков (для фактической обработки) и / или использовать TPL.Здесь вам может помочь TaskScheduler с максимальным параллелизмом.
Я не могу придумать ничего из коробки, которое будет делать то, что вы ищете.Возможно, вы захотите соединить ConcurrentQueue
с EventWaitHandle
и некоторым количеством рабочих потоков, которыми вы можете управлять.