Описание работы:
andrey.moveax.ru/post/csharp-sync-to-async
И из него:
1. Новый поток создается вами при необходимости. TaskCompletionSource создает только инстанс типа Task
2. Ожидает в том который запросил результат.
3. ManualResetEvent работает с обьектом ядра "event", и этот обьект не блокирует поток.
4. "event" вы всегда можете проверить на состояние и если оно не сигнальное, но продолжить нужные дела.