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); } }
3 Réponses :
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 <>.
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
Vous ne savez pas pourquoi cela a été rejeté, peut-être parce que ce n'est qu'un vidage de code sans aucune explication?
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); }
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éthodeasynchrone
, soit vousattendez
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 renvoyerIViewComponentResult
.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?