J'ai une boucle de temps dans un service Windows qui fonctionne pendant certaines fois x et initiez des appels téléphoniques X après les avoir lu depuis un fichier. Maintenant, si je veux faire une interface utilisateur qui donne une option pour arrêter les appels téléphoniques, c'est-à-dire une boucle tandis que la boucle tandis que avant de finir. Comment dois-je le faire?
Permet de supposer que j'ai une fonction. P>
DialCalls(x) { for(int i= 0 ; i<x ; i++) { // Initiate call } }
7 Réponses :
en utilisant Tâche Annulation (Nouveau dans .NET 4): < Pré> xxx pré>
http://blogs.msdn.com/b/csharpfaq/archive/2010/07/19/parallel-programming-task-cancellation.aspx La tâche avale des exceptions, donc il y a un peu de nettoyage à, peut-être aussi isisposable? sur les exceptions de tâches p> p>
C'est une bonne réponse (SO +1), mais vous pouvez l'améliorer en y compris quelques extraits pertinents de l'article.
Vous pouvez écrire une instruction if-à-la-chaussée dans votre boucle, pour interroger l'état de l'événement externe.
Par exemple, vous pouvez avoir un drapeau: p>
et dans votre événement externe, vous définissez le drapeau Break_out sur true: p> BOOL BREAK_OUT = FAUX; code> p>
break_out = true; p> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> Maintenant, dans votre boucle, vous pouvez avoir: p>
Créer un événement d'annulation de support d'événement:
while (true) { var e = new System.ComponentModel.CancelEventArgs(); if (Call != null) { Call(this, e); } if (!e.Cancel) { // Initiate call } else { break; } }
En utilisant une variable racontant quand se casser.
for (int i=0; i<x && !_cancel; i++)
avoir une variable globale qui est volatile
Implémentez un point d'extrémité sur le service qui accepte un message qui bascule une variable globale / statique booléenne (ou une autre) et que vous avez la boucle à l'intérieur de DIALCALLS code> Cochez ladite variable au début de chaque itération. Cela n'interrompiera aucun appels téléphoniques actuellement en cours, mais je parie que vous ne voulez pas que le service raccroche au milieu de l'appel, ne passez pas à la suivante. Cela interromptait également pour tous les threads; Assurez-vous simplement de rendre la variable elle-même est thread-sûre (par exemple, utilisez le mot-clé code> volatile). p>
while (!_shouldStop) { /* work in progress */ } and in the Stop() method which should be on the same worker class the bool variable must be set as true.Also, if there is any waiters (like AutoResetEvent) they must be .Set();.
Pour les gens suggérant
volatile code>: blogs.msdn.com/b/ericlippert/archive/2011/06/16/...