2010-10-14 8 views
0

Je dois démarrer un thread pour effectuer une tâche longue en arrière-plan (même si le navigateur est fermé) sans attendre de réponse sur un événement de clic de bouton d'une page Web.démarrer et arrêter des threads à partir d'ASP.NET

Je dois également pouvoir arrêter cela plus tard si l'utilisateur le souhaite.

Comment est-ce que je peux faire ceci?

Est-il possible de stocker le id du thread dans la base de données et l'annuler plus tard?

Ai-je besoin d'effectuer un appel asynchrone webservice OU wcf pour y parvenir? Comment puis-je arrêter la tâche longue plus tard si nécessaire dans ce cas?

Merci d'avance.

Répondre

2

Je suggère que votre application ASP.Net écrive des demandes à une table de base de données et gère ces demandes avec un service Windows.

Je voudrais utiliser une table pour mettre en file d'attente de nouvelles tâches et une table distincte pour gérer les tâches en cours d'exécution. Cette seconde table peut être utilisée pour signaler une progression ou pour tuer une tâche en cours d'exécution. Une fois les tâches terminées, vous pouvez les déplacer vers une troisième table avec des données récapitulatives pour une analyse ultérieure.

La base de données vous offre également la persistance. Par conséquent, si le serveur tombe en panne, le service Windows peut effectuer un redémarrage automatique des tâches sans que l'utilisateur ne les soumette à nouveau.

Si vous avez beaucoup de tâches en file d'attente, vous pouvez générer des services Windows sur plusieurs serveurs d'applications pour accélérer les choses, toutes contrôlées via la base de données.

+0

c'est ce que j'ai presque décidé, en raison de divers problèmes impliqués (comme les équilibreurs de charge, etc.) dans la gestion des tâches de longue durée sur le serveur web. Le service Windows peut démarrer plusieurs threads pour effectuer les tâches en parallèle. le seul problème avec le service Windows est qu'il doit continuer à interroger la base de données toutes les secondes ou quelques minutes pour vérifier les nouvelles demandes, ce qui n'est pas efficace en dehors des heures de pointe, il vaudra mieux que ce soit un événement, comme un événement est publié lorsque l'utilisateur fait une demande et qu'un service s'y abonne et agit UNIQUEMENT lorsqu'il y a une nouvelle demande. Ai-je besoin d'utiliser MSMQ pour cela? – RKP

+0

Vous pouvez essayer MSMQEvent et voir si cela fonctionne pour vous. L'interrogation ne devrait pas mettre beaucoup de charge sur le serveur à moins que vous ne le marteliez constamment. Vous pouvez reculer sur l'intervalle pendant les heures creuses si c'est un gros problème. Mais le but des machines est de faire des choses, donc si ça ne fait rien d'autre, qu'est-ce qui ne va pas avec un sondage? –

+0

merci pour la réponse – RKP

0

Vous pouvez utiliser la classe backgroundworker:

instancier un BackgroundWorker, définir un gestionnaire d'événements DoWork et un gestionnaire d'événements RunWorkerCompleted. Puis démarrez l'action à l'aide de la méthode RunWorkerAsync. Vous pouvez annuler l'action à l'aide de la méthode CancelAsync.

Peut-être que vous pouvez stocker une référence à votre travailleur dans le cache ou dans l'application (ou dans la session si elle est spécifique à l'utilisateur) pour le récupérer lorsque vous avez besoin d'annuler.

Questions connexes