На самом деле это довольно интересный вопрос и сценарий. В какой-то степени асинхронность - это новая мода (хотя на самом деле это не так уж и ново). В Entity Framework 6 появились асинхронные методы, и каждый... отдельный... фрагмент... документации... внезапно начал использовать асинхронность для всего. Я думаю, что мы видим немного то же самое здесь. MVC 6 поддерживает асинхронность для таких вещей, как частичный рендеринг, так что, боже мой, теперь мы все просто должны использовать асинхронность.
Async служит одной очень конкретной цели. Это позволяет вернуть активный поток в пул для выполнения других задач, пока текущая задача находится в состоянии ожидания. Ключевой частью этого является "состояние ожидания". Некоторые задачи просто несовместимы с асинхронностью. Работа с привязкой к ЦП, такая как сложный финансовый анализ, никогда не позволяет потоку переходить в состояние ожидания, поэтому все эффективно выполняется как синхронизация, даже если вы настроили ее как асинхронную. С другой стороны, вещи, связанные с задержкой в сети (запрос ресурса из веб-API, запрос к базе данных и т. д.) или связанные с вводом-выводом (чтение/запись файлов и т. д.), могут иногда иметь периоды, когда поток ожидание завершения какого-либо другого процесса, прежде чем он продолжит обработку.
Что касается частичного рендеринга, единственная часть, которая не полностью связана с процессором, - это чтение самого файла представления из файловой системы. Хотя этого технически достаточно, чтобы сделать его подходящим для асинхронного режима, сколько времени на самом деле потребуется, чтобы прочитать текстовый файл, который, вероятно, не превышает 50 КБ. К тому времени, когда поток будет передан обратно в пул, вероятно, пришло время запросить его обратно, поэтому в этот момент вы фактически используете ресурсы более неэффективно.
Короче говоря, не попадайтесь в ловушку "это можно сделать асинхронно, поэтому я должен сделать это асинхронно". Каждое использование следует оценивать с точки зрения того, действительно ли в нем есть ценность. Async имеет много накладных расходов, и если вы говорите только о нескольких миллисекундах времени ожидания, это, вероятно, не стоит всех этих дополнительных накладных расходов.
Метод PartialAsync доступен для частичных представлений, содержащих асинхронный код (хотя код в представлениях обычно не рекомендуется):
Также примечание на странице.
Если ваши представления должны выполнять код, рекомендуется использовать компонент представления вместо частичного представления.
Таким образом, вы должны использовать Partial и избегать PartialAsync, и если вы обнаружите, что у вас есть PartialAsync, вы должны спросить себя, делаете ли вы что-то неправильно, возможно, вам следует вместо этого использовать ViewComponent или перенести логику из представления в контроллер.
Ответ 3 · рейтинг 2 · Krishna Santosh Sampath
Что касается "ожидания Html.PartialAsync" - эта ссылка может вам помочь - http://aspnetwebstack.codeplex.com/workitem/601 (также следите за комментариями) (в чем именно была проблема раньше).
Я работаю над общедоступным веб-сайтом, созданным на MVC 6, и "ожидание Html.PartialAsync" быстрее, чем "Html.Partial", особенно когда представление содержит много компонентов.
Удаление "ожидания" из Html.PartialAsync, очевидно, не работает, и Html.PartialAsync выдает имя типа (например, "System.Threading.Tasks.Task`1[Microsoft.AspNet.Mvc.Rendering.HtmlString]") вместо фактического вида.
Ответ 4 · mikus
Просто чтобы поддерживать ветку в актуальном состоянии для тех, кто посещает ее в эпоху ядра asp.net.
В настоящее время согласно документации:
Partial и RenderPartial являются синхронными эквивалентами PartialAsync и RenderPartialAsync соответственно. Синхронные эквиваленты не рекомендуются, поскольку существуют сценарии, в которых они взаимоблокируются. Синхронные методы планируется удалить в будущем выпуске.
Но если вкратце, то похоже, что синхронная версия Partial просто вызывает асинхронную версию с GetResult, и в некоторых сценариях это рецепт взаимоблокировок.
Подводя итог, нет реальных причин не использовать асинхронную версию. Есть причины не использовать синхронизирующие. Несмотря на то, что на самом деле мало шансов столкнуться с взаимоблокировками без огромной нагрузки и причудливой логики в представлениях... Но если вы это сделаете, отлаживать и исправлять будет ужасно сложно.
var result = htmlHelper.RenderPartialAsync(partialViewName, htmlHelper.ViewData.Model, viewData: null);
result.GetAwaiter().GetResult();