web-dev-qa-db-fra.com

Longue tâche dans l'API Web

Voici mon problème: je dois appeler plusieurs méthodes tierces dans un ApiController. La signature de ces méthodes est Task DoSomethingAsync(SomeClass someData, SomeOtherClass moreData). Je souhaite que ces appels continuent à s'exécuter en arrière-plan, une fois que ApiController a renvoyé les données au client. Lorsque DoSomethingAsync est terminé, je souhaite enregistrer et éventuellement enregistrer des données dans le système de fichiers. Comment puis je faire ça? Je préférerais utiliser la syntaxe asyny/wait.

13
TEst16

Stephen a expliqué pourquoi le fait de commencer par de longues tâches incessantes dans ApiController est une mauvaise idée. 

Peut-être devriez-vous créer un service distinct pour exécuter ces tâches incessantes. Ce service pourrait être un autre ApiController, un ouvrier derrière une file d'attente, tout ce qui peut être hébergé seul et avoir une durée de vie indépendante.

Cela faciliterait beaucoup la gestion des différentes durées de vie des tâches et séparerait les préoccupations des tâches de longue durée des principales responsabilités d'ApiController.

7
Panagiotis Kanavos

Bonne nouvelle: il existe une nouvelle solution dans .NET 4.5.2 appelée API QueueBackgroundWorkItem. C'est vraiment simple à utiliser:

HostingEnvironment.QueueBackgroundWorkItem(ct => DoSomething(a, b, c));

Voici un article qui le décrit en détail.

https://blogs.msdn.Microsoft.com/webdev/2014/06/04/queuebackgroundworkitem-to-relicitement-schedule-and-run-background-processes-in-asp-net/

Et voici un article qui mentionne quelques autres approches non mentionnées dans ce fil de discussion. http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx

21
Ender2050

Vous ne voulez presque jamais faire cela. C'est presque toujours une grosse erreur.

ASP.NET (et la plupart des autres serveurs) partent du principe qu'il est prudent de supprimer votre service une fois que toutes les demandes sont terminées. Donc vous avez aucune garantie que votre journalisation sera faite ou que vos données seront écrites sur le disque. En particulier avec les écritures sur disque, il est tout à fait possible que vos écritures soient corrompues.

Cela dit, si vous êtes absolument sûr que vous souhaitez implémenter ce extrêmement dangereux design, vous pouvez utiliser le BackgroundTaskManager de mon blog .

17
Stephen Cleary

Comme souligné par d'autres, non recommandé. Cependant, chaque fois que vous en avez besoin, jetez un coup d'œil à IRegisteredObject

Voir également

http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx/

2
Alex Nolasco