Может ли кто-нибудь объяснить, почему Razor вызывает InvokeAsync, но класс реализует Invoke

Я знакомлюсь с чужим кодом, и он есть в Index.cshtml:

        @if (Model.Type == Group)
        {
            @await Component.InvokeAsync("GroupMessage")
        }

и это в классе ViewComponent

public class GroupMessageViewComponent : ViewComponent
{
    public IViewComponentResult Invoke()
    {
        return View();
    }
}

Итак, в разметке есть InvokeAsync, но класс реализует только Invoke. Ее больше нет в компании, поэтому я не могу спросить ее о причинах ее дизайна (и, вероятно, демонстрирую свое незнание синхронного / асинхронного!)

Спасибо.


person Edwardo    schedule 26.05.2021    source источник


Ответы (1)


В методе не используется асинхронный вызов, нет await. ViewComponent имеет 2 метода InvokeAsync и Invoke.

Таким образом, вы можете использовать только синхронный метод InVoke в своем GroupMessageViewComponent, иначе вы получите предупреждение :

предупреждение CS1998: в этом асинхронном методе отсутствуют операторы ожидания, и он будет выполняться синхронно. Рассмотрите возможность использования оператора await для ожидания неблокирующих вызовов API или await Task.Run (...) для выполнения работы, связанной с процессором, в фоновом потоке.

Вы можете увидеть этот поток.

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

person Yinqiu    schedule 27.05.2021