И я хочу использовать async / await во всех потоках, но я узнал, что async / await использует управляемый пул потоков для запуска продолжения, что означает, что обработка запросов может быть отложена из-за показа множества задач, интенсивно использующих процессор вверх (да, так много, поэтому у меня ограниченное количество потоков для этой работы)?
Это достаточно подробный анализ. Технически, это не async
/ await
, который нуждается в пуле потоков для продолжения, но внутренние реализации метода TAP. Тем не менее, это общий шаблон в BCL, и из-за этого исчерпание пула потоков может вызвать задержки для асинхронного завершения.
Если я хочу ограничить параллелизм, то я не должен использовать TAP ?
Пока вы не перегружаете пул потоков, вы можете использовать TAP. Ограничение параллелизма освободило бы пул потоков, который включит TAP.
Если я хочу выполнить некоторую работу в фоновом режиме для времени жизни приложения, то я также не должен использовать TAP?
Я бы подумал об этом как о "не утопите пул потоков в работе". Исчерпанный пул потоков не подходит для любых видов работ.
Должен ли я написать реализацию ThradPool со своим собственным SyncronizationContext для этого? Есть ли другой способ запустить продолжение в некотором наборе потоков?
Вы можете использовать SynchronizationContext
, чтобы контролировать, где await
возобновляет выполнение, но все еще есть внутренние BCL-завершения, которые нужно поставить в очередь в пул потоков. Там нет контроля над этим; единственный реальный вариант - оставить пул потоков свободным.