Web Api - le-Feu et Oublier
J'ai une Web API d'action où j'ai besoin d'exécuter une tâche et oublier cette tâche.
C'est ainsi que ma méthode est organisée aujourd'hui:
public async Task<SomeType> DoSth()
{
await Task.Run(...);
.....
//Do some other work
}
Le truc, c'est que de toute évidence, il s'arrête à la attendent la ligne d'attente quand c'est fait, et seulement alors, continue le travail.
Et j'ai besoin de "fire and forget"
Dois-je simplement.Run() sans asynchrone de l'attendent?
Double Possible. stackoverflow.com/questions/33834540/...
Double Possible de le Feu et oublier méthode async dans asp.net mvc
Double Possible de le Feu et oublier méthode async dans asp.net mvc
OriginalL'auteur D. Jones | 2016-03-31
Vous devez vous connecter pour publier un commentaire.
J'ai un blog qui rentre dans les détails de plusieurs approches différentes pour fire-and-forget sur ASP.NET.
En résumé: d'abord, essayez de ne pas faire de feu et oublier à tous. C'est presque toujours une mauvaise idée. Avez-vous vraiment veulent "oublier"? Comme dans, ne pas se préoccuper de savoir si elle a réussi ou pas? Ignorer les erreurs? Accepter occasionnel "perdu" sans aucun journal de notifications? Presque toujours, la réponse est non, fire-and-forget n'est pas la bonne approche.
Une solution fiable est de construire une bonne architecture distribuée. C'est, construire un message que représente le travail à faire et de la file d'attente de message à une source fiable de la file d'attente (par exemple, d'Azur, à la File d'attente, MSMQ, etc). Puis indépendant backend que le processus de la file d'attente (par exemple, d'Azur, à WebJob, Win32 service, etc).
Pas. C'est la pire solution possible. Si vous doit ne fire-and-forget, et vous n'êtes pas prêt à construire une architecture distribuée, puis envisager de Hangfire. Si cela ne fonctionne pas pour vous, alors à la très moins, vous devez enregistrer votre cowboy travail de fond avec l'ASP.NET runtime via
HostingEnvironment.QueueBackgroundWorkItem
ou mon ASP.NET Tâches en arrière-plan de la bibliothèque. Notez que QBWI et AspNetBackgroundTasks sont peu fiables solutions; ils ont juste minimiser la chance que vous allez perdre du travail, pas empêcher.Pourquoi ne pas utiliser une
HostingEnvironment.QueueBackgroundWorkItem
? Il est tout aussi facile à utiliser et au moins un peu plus sûr queTask.Run
. Vous avez encore de ne pas l'utiliser pour tout ce qui est critique, mais bien sûr, sans importance, le travail peut y aller. Sur une note de côté, vous ne savez pas combien de fois le pool d'applications de recyclage autant que je me souvienne, c'est tous 19 heures par défaut, mais ASP.NET allons le faire plus souvent si elle pense que votre application ne fonctionne pas droit.Ne pouvez pas utiliser
HostingEnvironment.QueueBackgroundWorkItem
puisque je n'ai pas .NET 4.5.2 dans tous nos milieux.Dans ce cas, vous pouvez utiliser mon (très petit) ASP.NET Tâches en arrière-plan de la bibliothèque.
Je n'aime pas le sentiment que les gens disent fire-and-forget est presque toujours une mauvaise idée, mais je suis d'accord avec l'avertissement. Dans mon cas, je fais les demandes et de journalisation d'avance et l'utilisateur est averti si les tâches réussit, ou un travail leur permet de savoir si elle échoue. Ils peuvent également vérifier l'état et être interdit de continuer si elle n'a pas réussi et ils doivent essayer de nouveau. Pourquoi est-ce une mauvaise idée? Juste le design en place pour tenir compte des échecs de sorte qu'ils peuvent être abordés.
OriginalL'auteur Stephen Cleary
Véritable feu et d'oublier les tâches peuvent être difficiles à asp.net comme souvent, ils pourront mourir avec la demande qu'ils ont été créés dans le cadre de.
Si vous utilisez 4.5.2+ vous pouvez utiliser QueueBackgroundWorkItem pour exécuter la tâche. En vous inscrivant tâches à l'aide de cette méthode, le domaine d'application essayer de retarder la fermeture jusqu'à ce qu'ils ont tous terminé mais il peut toujours y avoir des cas où ils seront tués avant qu'ils soient terminés. C'est probablement la chose la plus simple à faire, mais la peine de lire pour voir exactement quels cas peut provoquer des emplois être annulée.
Il y a un outil appelé hangfire qui utilise un stockage permanent pour s'assurer qu'une tâche est terminée et a été intégrée à la nouvelle tentative d'erreur et de la fonctionnalité d'enregistrement. C'est plus pour les "tâches d'arrière-plan", mais ne convenir à feu et à oublier. Cela est relativement facile à installer et offre une grande variété de supports de sauvegarde, je ne me rappelle pas les détails exacts, mais certains nécessitent une licence et d'autres pas (comme MSSQL).
fire and forget
dans ASP.NET WebForms etwindows.close()
?OriginalL'auteur Fermin
Pour fire and forget, utilisez ce
OriginalL'auteur Catalin
Jamais le feu et oublier, parce que vous n'avez pas la chance de voir toutes les erreurs, ce qui rend pour une très maladroit de dépannage si quelque chose va mal (avoir de la méthode de tâche de faire sa propre gestion d'exception n'est pas garanti de fonctionner, parce que la tâche peut ne pas démarrer correctement en premier lieu). À moins que vous vraiment n'avez pas l'esprit si la tâche n'a rien ou pas, mais c'est tout à fait inhabituel (puisque, si vous avez vraiment ne se soucient pas, pourquoi exécuter la tâche en premier lieu)? À tout le moins, de créer votre tâche avec un continuation:
Vous pouvez le rendre plus sophistiqué que vos besoins.
Dans le cas spécifique d'une API web, vous pouvez réellement envie d'attendre pour votre arrière-plan des tâches à terminer avant de remplir votre demande. Si vous ne le faites pas, vous êtes en laissant les choses en arrière-plan qui peuvent dénaturer la charge de votre service peut vraiment prendre, ou même arrêter complètement de travailler si les clients le feu trop de demandes et vous ne faites rien à gaz. Vous pouvez recueillir des tâches et émettre un
await Task.WhenAll(...)
à la fin de l'atteindre; de cette façon, vous pouvez continuer à faire un travail utile tout votre tâche de fond travaillé à l'écart, mais vous n'avez pas de retour jusqu'à ce que tout est fait.OriginalL'auteur Jeroen Mostert
- Je utiliser HangFire.
C'est le meilleur pour moi.
Un moyen facile d'effectuer le traitement en arrière-plan .NET et .NET applications de Base. Pas de Service de Windows ou de séparer les processus requis.
Soutenu par le stockage persistant. Ouvert et gratuit pour une utilisation commerciale.
OriginalL'auteur Majid gharaei
Je suis d'accord avec les autres que vous ne devriez pas simplement oublier votre appel. Cependant, pour répondre à votre question, si vous supprimez attendent à partir de la Tâche.Run() de la ligne, l'appel ne sera pas de blocage comme indiqué ici
OriginalL'auteur Avinash Kumar
Il y a quelques posts ici qui poussent le “Jamais " tire et oublie”, c'est mal etc.
La vérité est qu'il n'est pas mal à partir de certains points de vue. Plutôt cités à certains égards.
Ce que cela devrait vraiment dire, c'est “l'utilisateur doit être en mesure d'incendie et d'oublier, mais il faut encore dire que le développeur /propriétaire.”
En est un bon exemple d'un formulaire de contact sur un site web. Le client remplit le formulaire et derrière les coulisses, il envoie un courriel au propriétaire du site. Certains serveurs de messagerie de prendre trop de temps pour traiter les envoyer, les paquets comme Hangfire (qui est ce que je voudrais utiliser) l'envoyer à un autre processus à l'extérieur de la toile "thread".
Oui, il doit en aviser le promoteur ou le propriétaire d'une certaine manière (et de garder le contact avec les détails) si une erreur se produit. Mais en aucun cas ne devrait-il informer le potentiel de contact sur la question. (sauf si vous voulez perdre un client potentiel)
OriginalL'auteur William Humphreys
Pour l'invocation d'un feu et d'oublier WebApi méthode, j'ai utilisé le code suivant pour s'assurer qu'il renvoie une réponse OK. J'mon cas, le porteur jeton d'autorisation créé à l'ouverture de session est stocké dans un cookie:
OriginalL'auteur CAK2