IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

C# Discussion :

Background Worker avec Do-While


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut Background Worker avec Do-While
    Bonjour à tous,
    j'essaye d'implémenter un background worker , pour avoir un sleep en tâche de fond (pour ne pas faire planter mon appli - "not responding").
    J'ai une bouble while et j'aimerais vraiment attendre 10sec avant de passer à l'élément suivant. Mais cela ne fonctionne pas, le sleep(10000) n'est pas pris en compte... des idées ?
    merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    BackgroundWorker worker = new BackgroundWorker();
                    worker.DoWork += worker_DoWork;
     
     
                    do
                    {
     
                            returnCode = LaunchScript(FileName, strCommandMonitor);
     
                            // if success we break the loop
                            if (returnCode == 2)
                            {
                                break;
                            }
     
                            // wait 5sec
     
     
                            nbrAttempts++;
                            //timeout
     
     
                               // wait 10 sec with Background Worker
                            if (!(worker.IsBusy))
                            {
     
                                worker.RunWorkerAsync();
     
                            }
                    }
     
     
     
     
                    while (nbrAttempts < 10);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            void worker_DoWork(object sender, DoWorkEventArgs e)
            {
                MessageBox.Show("test");
                Thread.Sleep(10000);
            }

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 93
    Points : 169
    Points
    169
    Par défaut
    Salut,

    Quand tu fais worker.RunWorkerAsync(), le code qui suit est exécuté juste après, c'est le principe même du BackgroundWorker (pouvoir lancer une tâche de fond et continuer l'exécute du code de la méthode).

    Tu devrais regarder du côté du Timer !

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 032
    Points : 5 469
    Points
    5 469
    Par défaut
    Je sais pas trop ce que tu veux faire, mais le BackgroundWorker te permet simplement de déporter une execution d'un code dans un autre thread de manière simplifier.
    En aucun cas il te permet de faire de pause dans ton code "courant" c'est justement tout l'inverse.

    Pourquoi ne pas mettre tout le while dans le background worker?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    BackgroundWorker worker = new BackgroundWorker();
                    worker.DoWork += worker_DoWork;
     
        worker.RunWorkerAsync();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
            void worker_DoWork(object sender, DoWorkEventArgs e)
            {  
                    do
                    { 
                            returnCode = LaunchScript(FileName, strCommandMonitor);
     
                            // if success we break the loop
                            if (returnCode == 2)
                            {
                                break;
                            }
     
                            // wait 5sec
     
     
                            nbrAttempts++;
                            //timeout
     
                MessageBox.Show("test");
                Thread.Sleep(10000);
                    }
     
                    while (nbrAttempts < 10);
            }

  4. #4
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut
    http://msdn.microsoft.com/fr-fr/libr...ers.timer.aspx

    "Génère des événements récurrents dans une application."

    je pense que Background Worker est préférable dans ce cas là..
    merci en tout cas pour ta réponse

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    [QUOTE=olivier1209;7223599"Génère des événements récurrents dans une application."[/QUOTE]

    récurrents ou non c'est toi qui choisit, un timer ca peut s'éteindre
    enfin il y a plein de moyens techniques de patienter 10 secondes

    le backgroundworker worker démarrer un thread
    donc quand on le lance, le code continue de s'exécuter pendant que le backgroundworker fait lui ausi son code
    donc ca ne sert pas à attendre
    déporter juste le sleep sur un thread ca ne sert à rien non plus

    il faut déporter tout traitement supérieur à quelques centaines de ms ou susceptible de l'être dans un thread séparé

  6. #6
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Points : 48
    Points
    48
    Par défaut
    Salut Pol63,

    jm'en suis sorti avec un Worker (tout ma fonction dedans qui tourne en tâche de fois) , qui me rend l'UI accessible - donc c'est cool

    Ce que j'essaye de faire maintenant c'est de changer l'onglet selectioné (automatiquement , dans le worker). Pour pas la faire bourrin j'ai crée une autre fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
         public void FormTab(int tab) 
        {
            string getTab = tabControl1.SelectedTab.ToString();
            tabControl1.SelectTab(tab);
        }
    que j'appelle comme ça : (si succès, on passe à l'étape - onglet - suivant)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      if (returnCode == 2)
                    FormTab(2);
    Malheureusement j'obtiens :

    Opération inter-threads non valide : le contrôle 'tabControl1' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
    des idées ?
    merci

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    Citation Envoyé par olivier1209 Voir le message
    des idées ?
    oui mais tu aurais tapé opération inter thread dans google du aurait déjà corrigé ton code
    si vraiment tu ne trouves pas on réécrira une fois de plus l'explication à cette erreur

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 032
    Points : 5 469
    Points
    5 469
    Par défaut
    Rajouter le backgroundWorker RunWorkerCompleted, qui lui est appelé par le thread createur du backgroundWorker (donc à priori l'UI).
    Et dedans tu appelles ta méthode.

    Enfin bon si là non plus tu lis pas mon message...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme avec background worker
    Par Zenith dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 04/11/2009, 10h56
  2. Problème avec un while...
    Par pcdj dans le forum Linux
    Réponses: 7
    Dernier message: 17/10/2005, 22h24
  3. Réponses: 2
    Dernier message: 17/10/2005, 22h16
  4. [Debutant/WinAPI] Souci avec boucle While et GetMessage()
    Par SnowStyle dans le forum Windows
    Réponses: 11
    Dernier message: 15/10/2005, 19h19
  5. Problème avec Do while rs.EOF
    Par lauraned dans le forum ASP
    Réponses: 12
    Dernier message: 21/05/2004, 12h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo