8
votes

Briser une boucle pendant l'utilisation externe

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
  }
}


1 commentaires

Pour les gens suggérant volatile : blogs.msdn.com/b/ericlippert/archive/2011/06/16/...


7 Réponses :


6
votes

en utilisant Tâche Annulation (Nouveau dans .NET 4): < Pré> xxx

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


1 commentaires

C'est une bonne réponse (SO +1), mais vous pouvez l'améliorer en y compris quelques extraits pertinents de l'article.



4
votes

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:

BOOL BREAK_OUT = FAUX;

et dans votre événement externe, vous définissez le drapeau Break_out sur true:

break_out = true; Maintenant, dans votre boucle, vous pouvez avoir: xxx


0 commentaires

3
votes

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;
    }
}


0 commentaires

0
votes

En utilisant une variable racontant quand se casser.

for (int i=0; i<x && !_cancel; i++)


0 commentaires

0
votes

avoir une variable globale qui est volatile xxx


0 commentaires

0
votes

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


0 commentaires

1
votes
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();.

0 commentaires