Использование ManualResetEvent
не очень хорошая идея.Вы просто блокируете поток, который выполняет ваш метод действия, а новый поток выполняет ваш код в очереди.
Решение зависит от того, какую обработку выполняет ваш код.Если обработка состоит из одной или нескольких операций ввода-вывода (операции с БД, обмен данными с другими службами, запись чтения из файловой системы), вы должны использовать асинхронные методы для этих операций ввода-вывода (большинство API предлагают таковые) с ключевым словом await
и помечать метод действия с помощью async
ключевое слово.
С другой стороны, если обработка - это просто некоторые интенсивные вычисления ЦП без каких-либо операций ввода-вывода, вы можете выполнять их синхронно с риском того, что пул потоков может быть исчерпан - если поступит слишком много запросов или создайтеваш собственный пул потоков (кроме стандартного пула потоков .NET) с ограниченным числом потоков, в которые вы ставите свои запросы в очередь и выполняете операции с интенсивным использованием ЦП.И в конце каждой обработки запроса вы отправляете HTTP-ответ.Это решение предотвращает исчерпание пула потоков, но его нелегко реализовать.