Appel de la méthode asynchrone dans le contrôleur

J’ai un contrôleur avec quelque chose comme ce qui suit:

public MyController : Controller { public ActionResult DoSomething() { CallSomeMethodWhichDoesAsyncOperations(); return Json(new { success = successful }, JsonRequestBehavior.AllowGet); } } 

Lorsque j’appelle mon contrôleur, l’erreur suivante apparaît:

Une opération asynchrone ne peut pas être démarrée à ce moment. Les opérations asynchrones ne peuvent être démarrées que dans un gestionnaire ou un module asynchrone ou lors de certains événements du cycle de vie de la page. Si cette exception s’est produite lors de l’exécution d’une page, assurez-vous qu’elle est marquée .

Maintenant, je n’ai pas le contrôle sur CallSomeMethodWhichDoesAsyncOperations et la méthode elle-même n’est pas asynchrone, mais en interne, elle déclenche et oublie de manière asynchrone. Que puis-je faire pour le réparer? Avoir essayé de changer le contrôleur en AsyncController et / ou de rendre la méthode asynchrone dans le contrôleur.

Modifier:

Quand j’ai essayé d’utiliser un AsyncController j’ai d’abord essayé, avec le même résultat

 public MyController : AsyncController { public ActionResult DoSomething() { CallSomeMethodWhichDoesAsyncOperations(); return Json(new { success = successful }, JsonRequestBehavior.AllowGet); } } 

Et alors

 public MyController : AsyncController { public async Task DoSomething() { CallSomeMethodWhichDoesAsyncOperations(); return Json(new { success = successful }, JsonRequestBehavior.AllowGet); } } 

Ce qui a changé l’exception au suivant “Un module ou un gestionnaire asynchrone s’est terminé alors qu’une opération asynchrone était toujours en attente.”

Maintenant, je n’ai pas le contrôle sur CallSomeMethodWhichDoesAsyncOperations et la méthode elle-même n’est pas asynchrone, mais en interne, elle déclenche et oublie de manière asynchrone. Que puis-je faire pour le réparer?

Contactez la personne qui l’a écrit et demandez- lui de le réparer.

Sérieusement, c’est la meilleure option. Il n’y a pas de bonne solution pour cela – seulement un hack.

Vous pouvez le pirater pour fonctionner comme ceci:

 public MyController : Controller { public async Task DoSomething() { await Task.Run(() => CallSomeMethodWhichDoesAsyncOperations()); return Json(new { success = successful }, JsonRequestBehavior.AllowGet); } } 

Ceci n’est pas recommandé. Cette solution déplace le travail vers un thread en arrière-plan. Ainsi, lorsque les opérations async reprendront, elles n’auront pas de HttpContext , etc. Cette solution complète la demande tant que le traitement est encore en cours. Cette solution ne se comportera pas correctement si le serveur est arrêté / recyclé au mauvais moment.

Il n’y a qu’une seule solution appropriée: changez CallSomeMethodWhichDoesAsyncOperations .