Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre à l'essai
    Comment arrêter une fonction sous C# Winforms
    Bonjour,

    Je cherche une manière simple d'arrêter un traitement en cliquant sur un bouton stop.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void buttonWriteFast_Click (object sender, EventArgs e)
    {
       WriteFast();
    }


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void buttonStop_Click (object sender, EventArgs e)
    {
      //code to stop WriteFast()
    }


    En fait, en cliquant sur le bouton stop, cela dirait d'arrêter la fonction WriteFast(), puis quand je recliquerais sur le bouton Start, cela redémarrerai l'action.
    Comment faire cela sous C# ?

    Merci de votre aide.

  2. #2
    Candidat au Club
    Si je comprends bien, tu as une fonction qui tourne en arrière plan (de manière asynchrone), et une fois que tu l'as appelée, elle te met dans une boucle dont tu ne sors jamais, c'est bien ça ?
    Si c'est le cas, tu peux utiliser une propriété de contrôle qui, quand elle est mise a false, te fait sortir de la boucle. Le code ressemblerait à ça :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private bool ExitWriteFast { get; set; }
     
    private void buttonWriteFast_Click (object sender, EventArgs e)
    {
       ExitWriteFast = false;
       WriteFast();
    }
     
    private void buttonStop_Click (object sender, EventArgs e)
    {
       ExitWriteFast = true;
    }


    Bien sûr, ça ne marche que si WriteFast() se trouve dans la même classe que tes boutons. Sinon, il va falloir passer par un objet.

  3. #3
    Membre à l'essai
    Je ne pense pas qu'un simple booléen résoudra le problème.

    Dans ton code, quand on clique sur stop, il mettra juste un booléen à true, cela n'arrêtera pas la fonction WriteFast().
    En fait, j'aimerais quand je lance un traitement avec le bouton start, que ce traitement soit arrêté quand je clique sur Stop.

  4. #4
    Expert éminent sénior
    Je vois deux approches différentes :
    • Utilisation de CancellationToken. Mais cela nécessite de revoir un peu la méthode, en modifiant notamment sa signature et en mettant au sein du code des points de vérification pour l'annulation ;
    • Utilisation d'un Thread (pas un Task mais bien un Thread). Les Threads ont une méthode Abort pour l'arrêter.


    La première solution est plus souple et moins sujette à problème, puisqu'on contrôle quand le traitement peut s'arrêter, mais nécessite une modification du code. La seconde est plus radicale et peut mener à avoir des états un peu incohérents en fonction de la nature du traitement si on y prend pas garde.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  5. #5
    Membre expérimenté
    Il faudrait également savoir s'il s'agit d'un "stop" (fin complète du traitement et abandon du contexte) ou bien d'une "pause" (l'exécution du traitement est suspendue mais peut reprendre sur l'état actuel).

  6. #6
    Membre à l'essai
    Citation Envoyé par Noxen Voir le message
    Il faudrait également savoir s'il s'agit d'un "stop" (fin complète du traitement et abandon du contexte) ou bien d'une "pause" (l'exécution du traitement est suspendue mais peut reprendre sur l'état actuel).
    Il s'agit d'un "stop" (fin complète du traitement et abandon du contexte).

  7. #7
    Candidat au Club
    A vrai dire, c'est assez difficile de répondre sans savoir ce que fais la méthode WriteFast().
    S'il s'agit d'une simple boucle, ma méthode marche, je l'ai testé pas plus tard qu'aujourd'hui pour résoudre un problème similaire. Ca marche car la propriété ExitWriteFast est partagée par tous les membres de la classe, donc si elle est mise à jour même de l'exterieur, les changements seront pris en compte dans la méthode WriteFast() (bien sûr, ce n'est pas le cas si WriteFast() se trouve hors de la classe de ta fenêtre).
    Sinon, comme l'a dit François DORIN, utiliser un Thread peut être une bonne solution, au moins tu seras sûr d'avoir le contrôle sur le traitement, et que celui-ci se fait bien en parallèle du reste du programme.

###raw>template_hook.ano_emploi###