Long de la tâche en cours d'exécution dans WebAPI
Voici mon problème: j'ai besoin de faire appel à plusieurs 3ème partie les méthodes à l'intérieur d'un ApiController. La signature de ces méthodes est Task DoSomethingAsync(SomeClass someData, SomeOtherClass moreData)
. Je veux ces appels à continuer à fonctionner en arrière-plan, après la ApiController a envoyé les données vers le client. Lorsque DoSomethingAsync
complète je veux faire des coupes et peut-être sauver quelques données pour le système de fichiers. Comment puis-je le faire? Je préfère utiliser le asyny/attendre la syntaxe.
Vous la tâche a quelque chose comme
Quand vous dites "après la ApiController a envoyé les données vers le client", voulez-vous dire que la connexion est fermée? D'un client peut recevoir des données à partir du serveur tout en gardant la connexion ouverte?
Oui, la connexion est fermée.
découvrez hangfire.io
Pour .Net Core 2.x, découvrez IHostedService. Un bon exemple sur ce blog: stevejgordon.co.royaume-uni/asp-net-core-2-ihostedservice. Semblable à hangfire concept.
.ContinueWith
. c'est là que vous pouvez faire votre enregistrement.Quand vous dites "après la ApiController a envoyé les données vers le client", voulez-vous dire que la connexion est fermée? D'un client peut recevoir des données à partir du serveur tout en gardant la connexion ouverte?
Oui, la connexion est fermée.
découvrez hangfire.io
Pour .Net Core 2.x, découvrez IHostedService. Un bon exemple sur ce blog: stevejgordon.co.royaume-uni/asp-net-core-2-ihostedservice. Semblable à hangfire concept.
OriginalL'auteur TEst16 | 2013-07-10
Vous devez vous connecter pour publier un commentaire.
Stephen décrit pourquoi partir essentiellement d'exécution long feu et oublier les tâches à l'intérieur d'un ApiController est une mauvaise idée.
Peut-être vous devriez créer un service distinct à l'exécution de ces fire-and-forget tâches. Que service peut être un autre ApiController, un travailleur derrière une file d'attente, tout ce qui peut être hébergé sur son propre et indépendant de vie.
Ce serait faire de la gestion de la tâche différente des durées de vie beaucoup plus facile et séparer les préoccupations de la longue durée d'exécution des tâches de la ApiController responsabilités essentielles.
OriginalL'auteur Panagiotis Kanavos
D'excellentes nouvelles, il est une nouvelle solution .NET 4.5.2 appelé le QueueBackgroundWorkItem API. C'est vraiment simple à utiliser:
Voici un article qui décrit dans le détail.
https://blogs.msdn.microsoft.com/webdev/2014/06/04/queuebackgroundworkitem-to-reliably-schedule-and-run-background-processes-in-asp-net/
Et voici anohter article qui mentionne quelques autres approches ne sont pas mentionnés dans ce fil.
http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx
Je ne pouvais pas obtenir ce pour travailler dans une auto-hébergé WebAPI au sein d'un Service Windows (backend de la couche de données).
OriginalL'auteur Ender2050
Vous presque jamais envie de le faire. Il est presque toujours une grosse erreur.
ASP.NET (et la plupart des autres serveurs) travail sur l'hypothèse qu'il est sans danger pour le démontage de votre service une fois que toutes les demandes ont terminé. Si vous avez aucune garantie que votre enregistrement sera fait, ou que vos données seront écrites sur le disque. En particulier avec les écritures sur disque, il est tout à fait possible que votre écrit est endommagé.
Cela dit, si vous êtes absolument sûr que vous souhaitez mettre en œuvre cette extrêmement dangereux conception, vous pouvez utiliser le
BackgroundTaskManager
à partir de mon blog.Je trouve que c'est acceptable de commerce de pour des choses comme: débogage d'enregistrement, l'enregistrement des performances, le suivi des événements (à l'aide d'un service externe). Dans tous ces cas, un "fire-and-forget" sémantique est acceptable et nous n'avons pas vraiment de soins si les événements peuvent se perdre dans le cas d'un service à la déchirure vers le bas. Ou est-il quelque chose que je suis absent?
Je dirais que le cas d'utilisation principal est mises à jour du cache. C'est une manière acceptable de faire la connexion, si vous acceptez que vos journaux peuvent ne pas avoir toutes les données. Je interpréter "le suivi des événements" comme une exigence de l'entreprise, donc pas un bon cas d'utilisation de ce. Si "l'événement de suivi" n'est pas important, puis "enregistrement de débogage", "l'enregistrement des performances", et "le suivi des événements" sont de trois types différents de l'enregistrement. Notez que ASP.NET 4.5.2 a quelque chose de similaire, intégré maintenant.
OriginalL'auteur Stephen Cleary
Comme souligné par d'autres, n'est pas recommandée. Cependant, lorsqu'il existe un besoin, il y a un moyen, afin de prendre un coup d'oeil à IRegisteredObject
Voir aussi
http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx/
OriginalL'auteur Alex Nolasco