Безопасно ли использовать ManualResetEvents в контроллере Web API? - PullRequest
0 голосов
/ 26 марта 2019

У меня есть веб-API, который принимает некоторые входящие данные. Контроллер помещает данные в очередь для обработки другим потоком, а затем отправляет ответ HTTP после того, как он «обнаружил», что данные были обработаны. Дизайн, о котором я думаю, - это использовать ManualResetEvent. Таким образом, контроллер поместит ссылку на событие в общую папку, затем waitOne. Когда другой поток завершит обработку, он поместит некоторый код состояния в общую папку и установит ManualResetEvent.

Это разумный подход? Безопасно ли использовать ManualResetEvent на контроллере Web API или это ухудшит производительность других входящих запросов?

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

Это определенно плохая идея.WaitOne приведет к блокировке текущего потока, что в конечном итоге приведет к исчерпанию потоков в пуле потоков.

Вы должны либо найти какую-нибудь ожидаемую реализацию дескриптора ожидания , например этот или используйте TaskCompletionSource для создания задачи, которую вы можете ожидать.

В любом случае ожидание задачи высвободит поток обратно в пул, чтобы он мог обрабатывать другие запросы, пока данные все еще находятся вочереди.

0 голосов
/ 27 марта 2019

Использование ManualResetEvent не очень хорошая идея.Вы просто блокируете поток, который выполняет ваш метод действия, а новый поток выполняет ваш код в очереди.

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

С другой стороны, если обработка - это просто некоторые интенсивные вычисления ЦП без каких-либо операций ввода-вывода, вы можете выполнять их синхронно с риском того, что пул потоков может быть исчерпан - если поступит слишком много запросов или создайтеваш собственный пул потоков (кроме стандартного пула потоков .NET) с ограниченным числом потоков, в которые вы ставите свои запросы в очередь и выполняете операции с интенсивным использованием ЦП.И в конце каждой обработки запроса вы отправляете HTTP-ответ.Это решение предотвращает исчерпание пула потоков, но его нелегко реализовать.

...