Как реализовать шаблон рассеяния в веб-приложении ASP.NET? - PullRequest
0 голосов
/ 05 июня 2018

Предположим, запрос ASP.NET WebAPI поступает в метод контроллера.

Предположим, что запрос представляет собой «событие», которое необходимо обработать.С событием связано несколько операций, которые должны выполняться параллельно.Например, каждой операции может потребоваться вызвать конкретную конечную точку REST на других серверах, которые являются операциями, связанными с вводом / выводом, которые должны начаться как можно скорее и не должны ждать, пока одна из них вернется, прежде чем начинать следующую.

Каков наиболее правильный / эффективный способ реализации этого шаблона?

Я читал, что использование Task.Run - плохая идея, потому что он просто захватывает дополнительные потоки ThreadPool, оставляя основной поток запросов незанятым / заблокированным.Хотя это имеет смысл, если бы я выполнял одну задачу, я не уверен, что этот совет применим в этом случае.

Например, если событие имеет 4 операции, которые необходимо выполнить (каждая из которых может иметь несколько операций ввода-вывода)связанных вызовов), я бы вызывал Task.Run в цикле 4 раза, чтобы инициализировать каждую операцию, а затем ждать выполнения задач с Task.WaitAll.

Q1: Будет ли основной поток запроса возвращен в ThreadPool для использования другим запросом в ожидании возврата Task.WaitAll, или он просто перехватит основной поток, оставив его бездействующим до завершения Task.WaitAll?

Q2: Если он перегружает основной поток, можно ли это решить, пометив метод контроллера ключевым словом async и вместо этого используя вызов await Task.WhenAll?Я предполагал, что это вернет основной поток в пул во время ожидания, что позволит использовать его для других запросов или операций с событиями.

Q3: Поскольку Task.Run ставит в очередьрабочий элемент, который может быть заблокирован при вызове, связанном с вводом / выводом, улучшится ли производительность, если все операции будут реализованы с помощью async и использованы вызовы await для основанных на задачах асинхронных методов ввода / вывода?

Относительновесь подход использования Task.Run для операций события, цель состоит в том, чтобы как можно быстрее начать все связанные с операциями вызовы ввода / вывода.Я полагаю, если бы (как в Q3) все операции были async методами, я мог бы просто запустить их все в главном потоке запросов в цикле, но я не уверен, что было бы лучше, чем запускать их с отдельным Task.Runзвонки.Может быть, есть совершенно другой подход, который я не знаю.

...