6 Réponses :


18
votes

Préférentiellement, évitez d'avoir de longues tâches exécutées dans un tel environnement.

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.

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 doit être complètement exceptionnel.

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.


1 commentaires

Sur les GAWS, utilisez Azure Webjobs



0
votes

Ma méthode préférée est la même chose que Robert Harvey propose de répondre à sa réponse.

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).


1 commentaires

Avez-vous un exemple rapide de cela?



0
votes

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


0 commentaires

0
votes

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): xxx

garder à l'esprit que le lastInvokeday doit être persisté dans la base de données ou sur Un fichier ...

Maintenant, si vous souhaitez activer une invocation immédiate de la tâche, vous pouvez simplement appeler runmytask () 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 verroue ) et déplacez le lastInvokeday Vérifiez à l'intérieur.

Est-ce que cela répond à votre question?


0 commentaires

2
votes

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 .

Parmi eux, et pour quelque chose de rapide et facile, je vous suggérerais de regarder en particulier à la WheetbackgroundworkItem ajouté à 4.5.2.

de l'expérience personnelle, la tâche ne le coupe pas. La queuebackgroundworkItem est bien meilleure.


1 commentaires

Le deuxième lien est mort, mais celui-ci fonctionne: blogs.msdn.microsoft.com/webdev/2014/06/04/...



0
votes

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

  1. 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)
    
  2. 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>

  3. 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')
    
  4. bénéfice p> li> ol> p>


0 commentaires