Je construis un site Web à l'aide de .NET 4. Il y a beaucoup d'articles MSDN datant de 2003, à propos de l'utilisation d'objets threads et 2007, en utilisant des pages asynchrones dans .NET 2 , mais c'est tout ce qui est assez rassis. Je sais .net 4 a apporté le classe de tâches A> et Quelques personnes avertissent vaguement l'utilisation à cet effet A >. p>
Alors je vous le demande, quelle est la méthode "préférée" circa 2011 pour le fond d'origine / travail asynchrone sous IIS dans ASP.NET 4? Quelles sont les mises en garde d'utiliser directement le fil / la tâche? Est async = vrai toujours en vogue? P>
EDIT: OK, OK, des réponses Il est clair que l'opinion est que je devrais faire un service si je peux. Mais les avantages de le faire à l'intérieur du WebApp sont significatifs, particulièrement plus faciles de déploiement / redéploiement. En supposant que le processus soit sans danger, alors, si je devais le faire à l'intérieur de l'IIS, quel est le meilleur moyen? P>
6 Réponses :
Préférentiellement, évitez d'avoir de longues tâches exécutées dans un tel environnement. P>
Déléguer des tâches longues à exécution à un service système stable via une interopérabilité, laissant l'application Web réactive et requise uniquement pour les demandes d'utilisateurs directes. P>
Les applications Web n'ont jamais été (et ne sont toujours pas) considérées comme des systèmes fiables - quiconque a déjà utilisé un navigateur a rencontré (au moins) un délai, pour être sûr; et une telle inconvénient (pour les deux parties) ne se limite pas à ce scénario. Bien entendu, tout système peut s'écraser, mais les circonstances entourant un tel événement sur un système intégré à être persistant em> doit être complètement exceptionnel. P>
Les services Windows sont conçus pour être longuement fonctionnant et si quelque chose ne va pas, vous avez généralement plus à craindre que votre service individuel. P>
Sur les GAWS, utilisez Azure Webjobs
Ma méthode préférée est la même chose que Robert Harvey propose de répondre à sa réponse. P>
Vous pouvez toujours utiliser le bibliothèque parallèle de tâche , mais tourner la tâche dans un processus distinct en dehors de l'IIS (la raison étant que l'IIS a un nombre limité de threads de travailleurs à distribuer et à imposer d'autres limitations pouvant faire de longues tâches imprévisibles). P>
Avez-vous un exemple rapide de cela?
Vous pouvez créer une threadpool statique comme cette http://www.dotnetperls.com/threadpool avec Numéro de threads limité (par exemple seulement 2). et ensuite les tâches de la file d'attente, mais il est fortement non recommandé car les serveurs Web ne sont pas destinés à ce type de tâches p>
Ceci est une description d'un scénario «une fois par jour».
Si vous souhaitez vraiment éviter de créer un service, vous pouvez démarrer une minuterie avec des intervalles de 1 minute. Chaque fois que le délégué de la minuterie est invoqué, vous devrez exécuter quelque chose comme celui-ci (pseudo code): p> garder à l'esprit que le lastInvokeday doit être persisté dans la base de données ou sur Un fichier ... p> Maintenant, si vous souhaitez activer une invocation immédiate de la tâche, vous pouvez simplement appeler Est-ce que cela répond à votre question? p> p> runmytask () code> sur demande.
Si son important pour vous de conserver le point d'exécution de la part d'une fois par jour, vous pouvez créer un bloc de code syncronisé à l'intérieur (avec une instruction code> verroue code>) et déplacez le
lastInvokeday code > Vérifiez à l'intérieur. P>
Il est préférable d'être évité, mais si vous êtes obligé de, considérez les pensées de Hanselman à Comment Exécuter des tâches d'arrière-plan dans ASP.NET . P>
Parmi eux, et pour quelque chose de rapide et facile, je vous suggérerais de regarder en particulier à la WheetbackgroundworkItem ajouté à 4.5.2. P>
de l'expérience personnelle, la tâche ne le coupe pas. La queuebackgroundworkItem est bien meilleure. P>
Le deuxième lien est mort, mais celui-ci fonctionne: blogs.msdn.microsoft.com/webdev/2014/06/04/...
Je pourrais suggérer une solution simple, qui n'utilise pas les services Windows, mais est capable d'invoquer une tâche à exécuter en dehors du sandbox IIS. En outre, cela pourrait être facilement adopté par toute autre langue ou mélange d'eux, dans mon cas, python
Créer un journal des événements et une source sur le serveur IIS (nécessite des droits d'administration), exécutant de la console PowerShell: P>
import win32evtlog app_name = "Automations" event_id = 2020 event_category = 0 event_type = win32evtlog.EVENTLOG_INFORMATION_TYPE messages = ['Starting automation'] # Logs event into the custom Automations log if it exists, # otherwise logs event into Windows/Application log handle = win32evtlog.OpenEventLog("localhost", app_name) win32evtlog.ReportEvent(handle, event_type, event_category, event_id, None, messages, None)
Créer une tâche de planificateur de tâche à exécuter sur l'événement, par exemple, avec ID = 2020, log = 'Automations' et Source = 'Automations'. Là, vous pouvez invoquer ce que vous aimez avec toutes les autorisations nécessaires P> li>
Préparez un code pour envoyer votre événement, tout en manipulant une demande Web. Vous donnant un exemple de python, mais vous pouvez l'adopter à votre langue: p>
[System.Diagnostics.EventLog]::CreateEventSource('Automations', 'Automations')
bénéfice p> li> ol> p>