Подтвердить что ты не робот

Когда использовать @await Html.PartialAsync в представлении в MVC 6

Я заметил, что на одном из блогов Scott Hanselman он использует следующий код в своих представлениях при использовании .Net 5 (MVC 6):

@await Html.PartialAsync("_LoginPartial")

против.

@Html.Partial("_LoginPartial")

Есть ли еще какая-либо документация о том, какой из них следует использовать?

4b9b3361

Ответ 1

На самом деле это довольно интересный вопрос и сценарий. В какой-то мере асинхронность - это новая жара (хотя это действительно не все, что новое). Entity Framework 6 попадает в асинхронные методы, и каждый... один... штук... из... документации... внезапно начинает использовать async для всего. Я думаю, что мы здесь немного похожи. MVC 6 поддерживает async для таких вещей, как рендеринг частичных данных, поэтому OMG мы все должны использовать async сейчас.

Async служит одной очень конкретной цели. Он позволяет возвращать активный поток в пул для задания других задач, пока текущая задача находится в состоянии ожидания. Ключевой частью этого является "состояние ожидания". Некоторые задачи просто несовместимы с асинхронными. Работа с процессором, такая как сложный финансовый анализ, никогда не позволяет потоку войти в состояние ожидания, поэтому все эффективно запускается как синхронизация, даже если вы настроили ее как асинхронный. С другой стороны, вещи, связанные с задержкой в ​​сети (запрос ресурса из веб-API, запрос на базу данных и т.д.) Или те, которые связаны с вводом-выводом (чтение/запись файлов и т.д.), Могут иногда иметь периоды, в которых поток ожидая завершения какого-либо другого процесса до того, как он продолжит обработку.

Глядя конкретно на частичный, единственный фрагмент, который не полностью связан с ЦП, читает сам файл вида из файловой системы. Хотя это достаточно технически, чтобы сделать его подходящим для асинхронного использования, сколько времени потребуется, чтобы прочитать, что по существу текстовый файл, который, вероятно, составляет менее 50 КБ. К тому моменту, когда поток будет возвращен в пул, возможно, потребуется время запросить его, поэтому вы фактически используете ресурсы более неэффективно в этот момент.

Длинные и короткие, не попадайте в ловушку "это может быть сделано async, поэтому я должен сделать это async". Каждое использование должно оцениваться с точки зрения того, действительно ли в нем значение. У Async много накладных расходов, и если вы говорите только о нескольких миллисекундах времени ожидания, возможно, это не стоит лишних дополнительных накладных расходов.

Ответ 2

В соответствии с документацией ASP.NET MVC по частичным представлениям. https://docs.asp.net/en/latest/mvc/views/partial.html

Метод PartialAsync доступен для частичных представлений, содержащих асинхронный код (хотя код в представлениях обычно не рекомендуется):

Также заметка на странице.

Если ваши представления должны выполнять код, рекомендуемый шаблон должен использовать компонент представления вместо частичного представления.

Итак, вы должны использовать Partial и избегать PartialAsync, и если вы окажетесь с PartialAsync, вы должны спросить себя, делаете ли вы что-то неправильно, возможно, вы должны использовать ViewComponent или переместить логику с точки зрения контроллера.

Ответ 3

Что касается "ждут 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 ]" ) вместо фактического представления.