Я хочу реализовать класс или шаблон, который гарантирует, что я никогда не буду выполнять более одной задачи за раз для определенного набора операций (вызовов HTTP). Вызовы задач могут исходить из разных потоков в случайное время. Я хочу использовать шаблон async-await, чтобы вызывающая сторона могла обрабатывать исключения, заключая вызов в try-catch.
Вот иллюстрация предполагаемого потока выполнения:

Псевдокод от вызывающего абонента:
try {
Task someTask = GetTask();
await SomeScheduler.ThrottledRun(someTask);
}
catch(Exception ex) {
// Handle exception
}
Вместо этого Taskclass здесь может быть классом Action в зависимости от решения.
Обратите внимание, что когда я использую слово «Расписание» в этом вопросе, я не обязательно использую его по отношению к Планировщик заданий .NET. Я недостаточно хорошо знаю библиотеку async-await, чтобы знать, под каким углом и с помощью каких инструментов подходить к этой проблеме. TaskScheduler может быть здесь уместен, а может и нет. Я прочитал документ Шаблон TAP и нашел шаблоны которые почти решают эту проблему, но не совсем (глава о чередовании).