Куча мелких нот:
Если вы используете некоторый .NET API, который внутренне использует ThreadPool, то вы не можете делать бесконечное ожидание, поскольку ОС владеет потоками из ThreadPool, эти потоки предназначены для «краткого» использования, а затем возвращаются обратно в ОС. Это самое надежное поведение. Несомненно, операционная система может увеличивать пул потоков по мере необходимости, если вы в конечном итоге включите их из-за длительной обработки, но лучше было бы избежать такого поведения.
Если вы работаете в XP, вы также можете избегать ThreadPool (уровень ОС и, следовательно, .NET), поскольку он был исправлен / оставлен в Windows Vista и более поздних версиях, версия XP считается менее надежной.
Если вы используете ThreadPool, вы в конечном итоге ставите в очередь асинхронную работу, так как она уже ждет выполнения работы.
Создать собственный ThreadManager довольно просто, вы можете найти множество примеров по этому поводу, но, как всегда, подобные вещи должны быть максимально простыми.
Что касается третьего пункта, лучше восстановить SFTP-соединение, чем уничтожить весь поток. Если вы завершаете работу потока (при условии, что ваш ThreadManager может с этим справиться, конечно же, никогда не уничтожайте потоки из ОС ThreadPool), то сначала ему придется вернуть необработанное задание обратно в какую-то очередь, что кажется слишком большой работой.