Voici le scénario: sur la connexion à l'utilisateur, je démarre une tâche qui écoute IMAP inactif pour les notifications de messagerie et il contient une connexion en direct avec le client via SignalR (type de notification push). Maintenant, le problème est comment puis-je annuler cette tâche? I.e. L'utilisateur annule la notification push ou la déconnexion .. P>
Edit: selon ma compréhension, par exemple, si 5 utilisateurs sont connectés au site, il y a 5 tâches en cours d'exécution? Alors, comment puis-je annuler des tâches individuelles? P>
3 Réponses :
Le travailleur asynchrone doit être modifié pour soutenir l'annulation p>
http://www.csharp-examples.net/cancel-asynchronique-method / p>
Vous pouvez également utiliser le travailleur de fond qui est un peu moins compliqué http://msdn.microsoft.com/en-us /Library/system.componentmodel.backgroundworker.Cancelasync.aspx P>
Un problème que j'ai rencontré lorsque vous envoyez une annulation à une source externe (DB, application) qui a déjà démarré un travail, s'il ne prend pas en charge l'annulation, vous devrez peut-être attendre jusqu'à la fin. P>
Edit: Je n'ai jamais fait cela avec MVC, mais j'ai trouvé un bon article sur "Utilisation d'un jeton d'annulation" pour un processus ASYCN qui prend un paramètre CANCellationToken dans MVC4. http: //www.asp .NET / MVC / Tutorials / MVC-4 / Utilisation-Asynchrone-Méthodes-in-aspnet-mvc-4 J'espère que cela aide. P>
Chaque fois que vous créez une tâche, vous devez créer un jeton d'annulation et y passer. Étant donné que chaque utilisateur est associé à une tâche, vous pouvez stocker la tâche et l'annulation jeton de la session de l'utilisateur. P>
À l'aide du jeton d'annulation stocké dans la session de l'utilisateur, vous pouvez facilement annuler la tâche lorsqu'il se déconnecte ou appuyez sur le bouton Annuler. p>
merci @mark. J'ai pensé à stocker le jeton, mais comment puis-je le stocker quand il n'est pas sérialisé?
@Ernity utilisez-vous un état de session hors-processus? Vous n'avez pas dit cela dans la question
J'utilise la session in-processus. Je ne sais pas comment ça fait la différence. Expliquez s'il vous plaît.
@Ernity Avez-vous essayé de stocker le jeton d'annulation en session? Je viens d'essayer avec succès maintenant.
@Ernity Lorsque vous utilisez une session InProCroC (par défaut), vous pouvez stocker des éléments de session et qui ne sont pas requis pour être sérialisés, mais si vous optez pour des options hors-propos, telles que SQL Server, ce sera un problème.
Le processus peut se tuer sans activité de l'utilisateur. Le moyen le plus simple d'échanger des variables dans l'autre thread - un fichier. Supposez que le navigateur client soit toujours ouvert, les demandes d'appel de la minuterie JavaScript appellent Ajax, qui écrit sur le serveur l'horodatage dans un fichier. Votre tâche lit périodiquement le fichier et lorsque l'horodatage est trop vieux, le processus se tue. La valeur du délai d'activité que vous pouvez définir de votre choix. P>
Pouvez-vous clarifier que les processus code> de tâches code> sont exécutés dans le service Web ou le service Windows ou autrement?
Salut @harshbaid Tâche est en cours d'exécution dans une application MVC.