J'ai une action standard, non asynchrone, du genre :
[HttpPost]
public JsonResult StartGeneratePdf(int id)
{
PdfGenerator.Current.GenerateAsync(id);
return Json(null);
}
L'idée étant que je sais que la génération du PDF peut prendre beaucoup de temps, je me contente de lancer la tâche et de revenir, sans me soucier du résultat de l'opération asynchrone.
Dans une application ASP.Net MVC 4 par défaut, cela me donne cette belle exception :
System.InvalidOperationException : Une opération asynchrone ne peut pas être lancée pour le moment. Les opérations asynchrones ne peuvent être lancées qu'au sein d'un gestionnaire ou d'un module asynchrone ou lors de certains événements du cycle de vie de la Page. Si cette exception s'est produite pendant l'exécution d'une page, assurez-vous que la page est marquée <%@ Page Async="true" %>.
Ce qui n'est pas du tout pertinent pour mon scénario. En y regardant de plus près, je peux mettre un drapeau à false pour empêcher cette exception :
<appSettings>
<!-- Allows throwaway async operations from MVC Controller actions -->
<add key="aspnet:AllowAsyncDuringSyncStages" value="true" />
</appSettings>
https://stackoverflow.com/a/15230973/176877
http://msdn.microsoft.com/en-us/library/hh975440.aspx
Mais la question est la suivante : y a-t-il un inconvénient à lancer cette opération asynchrone et à l'oublier à partir d'une action synchrone du contrôleur MVC ? Tout ce que j'ai pu trouver recommande de rendre le contrôleur asynchrone, mais ce n'est pas ce que je recherche - cela ne servirait à rien puisqu'il devrait toujours revenir immédiatement.