1
votes

Dans ViewComponent: Cette méthode asynchrone ne dispose pas d'opérateurs 'await' et s'exécutera de manière synchrone

Dans ViewComponent, j'ai reçu cet avertissement: (J'ai utilisé ASP.NET Core 2 )

avertissement CS1998: Cette méthode asynchrone ne dispose pas d'opérateurs 'await' et s'exécutera de manière synchrone. Pensez à utiliser l'opérateur 'await' pour attendre les appels d'API non bloquants, ou 'wait Task.Run (...)' pour effectuer un travail lié au processeur sur un fil d'arrière-plan.

Comment puis-je le résoudre?

 <div class="container">
        @await Component.InvokeAsync("GenericReport", new GenericReportViewModel() { })
    </div>

Mise à jour:

en vue, j'ai @await:

public class GenericReportViewComponent : ViewComponent
{
   public GenericReportViewComponent()
   {
   }
   public async Task<IViewComponentResult> InvokeAsync(GenericReportViewModel model)
   {
       return View(model);
   }
}


8 commentaires

Supprimez async de la définition de méthode.


Quelle partie du message d'erreur n'est pas claire pour vous? Supprimez async lorsque vous ne faites pas async et utilisez await dans la méthode lorsque vous le faites


InvokeAsync n'a en effet aucune opération asynchrone. Soit vous ne feriez plus la méthode asynchrone , soit vous attendez une opération dans la méthode.


D'après ce que vous avez publié, votre méthode InvokeAsync ne fait rien d'asynchrone. Vous pouvez supprimer en toute sécurité async et renvoyer IViewComponentResult .


Mise à jour: en vue, j'ai @await: ... mais vous n'avez pas d'attente dans le corps InvokeAsync


@Selvin: Cela signifie que je n'ai pas besoin d'utiliser async?


1. comme l'a écrit Tseng ... l'avertissement est explicite 2. vous avez déjà répondu


pourquoi voudriez-vous qu'il appelle avec wait? votre méthode contient-elle une méthode attendue à l'intérieur?


3 Réponses :


2
votes

Cela n'a pas besoin d'être asynchrone car vous ne faites rien qui bénéficierait d'une opération asynchrone. Supprimez l'async et la tâche <>.


0 commentaires

3
votes

Vous n'utilisez aucun appel asynchrone dans la méthode (il n'y a pas de wait ), d'où l'avertissement. ViewComponent a 2 méthodes InvokeAsync et Invoke . Vous devez utiliser la version synchrone ( Invoke ) du ViewComponent lorsqu'il n'y a pas d'appels asynchrones dans l'implémentation:

public class GenericReportViewComponent : ViewComponent
{
   public IViewComponentResult Invoke(GenericReportViewModel model)
   {
       return View(model);
   }
}

Voici la documentation section sur le travail synchrone: https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components?view=aspnetcore-2.2#perform-synchronous-work


1 commentaires

Vous ne savez pas pourquoi cela a été rejeté, peut-être parce que ce n'est qu'un vidage de code sans aucune explication?



3
votes

Vous n'avez aucune méthode wait dans votre action InvokeAsync

Vous pouvez supprimer en toute sécurité async et changer le retour en IViewComponentResult

public IViewComponentResult Invoke(GenericReportViewModel model)
{
   return View(model);
}


0 commentaires