У меня есть служба Windows .NET, которая реализует сервер сокетов с использованием парадигмы ввода-вывода асинхронного ввода-вывода BeginRead/EndRead. Теперь этот код сокета должен быть вызван в асинхронный код async/Task/await.Что происходит, когда вы используете Task.Run так сильно, что пул потоков исчерпан?
Я использовал метод запуска AsyncContext библиотеки Nito.AsyncEx 'Run, но у меня были оговорки о том, блокирует ли это вызов из EndRead, удерживая заложник рабочего потока. Совет, который я получил до my earlier question, должен был использовать Task.Run вместо Ninto.AsyncEx AsyncContext.Run. Это отправляет вызов в код async/await и немедленно возвращается. Мне пришло в голову, что при загрузке у клиентов нет отклика на то, чтобы удержать запросы от наводнения пула потоков.
Я перепрошу свой первоначальный вопрос о AsyncContext.Run от Nito.AsyncEx: он удерживает поток, на который он вызван (поток потока, вызывающий обратный вызов EndRead), или освобождает этот поток, в то время как асинхронный ввод-вывод, который вызывает вызов в фоновом режиме?
Если Nite.AsyncEx AsyncContext.Run действительно блокирует, то Task.Run представляется моим единственным выбором. Любые советы о том, как откликаться на запросы клиентов для предотвращения истощения пула потоков?
Сервер сокетов - это требование для небольших накладных расходов для наших клиентов с несколькими и высокими пропускными способностями. Мы также поддерживаем HTTP, и этот код использует HttpTaskAsyncHandler, поэтому я не беспокоюсь о его масштабируемости и у него больше клиентов с более низкими требованиями к пропускной способности. Использование AsyncContext.Run не будет нажимать на клиента для многих наших типов запросов (они начинают/заканчивают свое ...). Мое беспокойство по поводу отклика клиента было необоснованным беспокойством ... мы контролируем, кто подключается к нашим серверам сокетов. Задача. Нужно быть в порядке. –