Положим, есть приложение, которое работает в рамках одного процесса и является многопоточным.
Вопрос №1: в рамках процесса может быть(а чаще всего и есть) больше потоков, чем есть физически (допустим, что физически у нас 16 потоков, без HT, 16 ядер). Таких программных потоков может быть 100, 200, 1000. Когда я выполняю в рамках программного потока какой-либо системный вызов синхронно,thread.Sleep или, к примеру, autoresetevent.Waitone(в случае ожидания ответа от некоторой внешней среды) , приводит ли это к блокировке и физического потока? Если я запущу параллельно 16 бесконечных thread.Sleep или заблокирую 16 autoresetevent-ов, приведет ли это к блокировке всех 16 физических потоков и зависанию всей ОС? Если ответ на этот вопрос- нет, не приведет, то возникает второй.
Вопрос №2: зачем использовать TAP, EAP или другие шаблоны и подходы, которые во многом предоставляют ту самую возможность не блокировать поток, используя различные конструкции, вроде taskcompletionsource, semaphoreslim, простых коллбэков, если управление потоками на пользовательском уровне позволяет держать множество программных потоков, которые не блокируют физические.