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, la bonne solution ? Car impossible de le faire fonctionner dans ma situation [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Informatique industriel
    Inscrit en
    Octobre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Informatique industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 2
    Par défaut Background Worker, la bonne solution ? Car impossible de le faire fonctionner dans ma situation
    Bonjour

    Je vous explique déjà le fonctionnement voulu, je travail en c# avec visual studio 2010 .NET 4.0

    J'ai un Form1 principal, dans lequel j'ai certaine donnée, et j'ai un bouton "Valider" pour enregistrer des données, jusque là, rien de bien compliqué.

    Là ou sa se complique, c'est que quand j'appuie sur le bouton valider, j'ai un texte qui s'inscrit "en attente"..., et je doit avoir une boucle (ou une tache...) qui se lance afin de vérifier toutes les 1 secondes que la fonction check() retourne TRUE, et que tant que cette fonction n'est pas à TRUE, le formulaire est en attente, il n'enregistre rien, et dès que la fonction est à TRUE, ca enregistre le formulaire, éventuellement dans ce formulaire je pourrai avoir un bouton pour annuler cette boucle de recherche...

    Bon dans un premier temps j'ai essayé un simple while(check()) directement dans le Form1, évidemment cela gèle tout mon formulaire, mais bon je me devais d'essayer :p

    J'ai donc vue qu'on pouvais utiliser un Background Worker, donc j'ai créé une class Background_Worker que j'appel quand j'appuie sur le bouton "Valider" de mon Form1, dans ce Background Worker je met ce qui va bien, mais là ou sa ne fonctionne pas, c'est dans la fonction bw_RunWorkerCompleted(), j’essaie d'appeler la fonction qui enregistre les données de mon Form1, par exemple

    Form1.save();

    ou encore

    Form1 form = new Form1();
    form.save();

    Le problème, c'est que sa n'enregistre rien, en fait au lieu d'utiliser le Form1 d'origine, j'ai l'impression qu'il en créé un nouveau vide, et qu'il essais de l'enregistrer!

    A savoir que je ne suis pas fermer à d'autre proposition si vous pensez qu'il y a une façon plus simple de faire qu'avec un Background Worker...

    Je vous n'affiche pas le vrai code car il est énorme, je vous affiche plutôt un code pour comprendre facilement comment j'essais de m'y prendre

    J'ai ajouté l'option needCheck, en fait quand je désactive cette fonction sa enregistre direct le formulaire, et ceci fonctionne bien.


    Form1.cs

    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
     
    namespace TEST
    {
        public partial class Form1 : Form
        {
            private void buttonValider_Click(object sender, RoutedEventArgs e)
            {
                if (needCheck)
                    save1();
                else
                    save3();
            }
     
            private void save1()
            {
                label1.text = "En attente de validation...";
                Background_Worker bw = new Background_Worker();
                bw.start();
            }
     
            public void save2()
            {
                /* Ici je fait certain traitement que je veux faire seulement quand needCheck est activé, puis je lance save3 pour enregistrer */
                save3();
            }
            private void save3()
            {
                 /* Ici j'enregistre mes données */
            }
        }
    }

    Background_Worker.cs

    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
    36
    37
    38
     
    namespace TEST
    {
        class Background_Worker
        {
            private BackgroundWorker bw = new BackgroundWorker();
     
            public Page()
            {
                bw.WorkerReportsProgress = false;
                bw.WorkerSupportsCancellation = true;
                bw.DoWork += new DoWorkEventHandler(bw_DoWork);
                bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
                bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
            }
            public void start(object sender, RoutedEventArgs e)
            {
                if (bw.IsBusy != true)
                {
                    bw.RunWorkerAsync();
                }
            }
            private void bw_DoWork(object sender, DoWorkEventArgs e)
            {
                BackgroundWorker worker = sender as BackgroundWorker;
     
                while(!check())
                    Thread.Sleep(1000);
            }
            private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                Form1 form = new Form1();
                form.save2();
     
                /* Si ici je met un messageBox, elle s'affiche bien */
            }
        }
    }

    Voilà, j'espère m'avoir bien exprimé, car parfois je suis tellement dans le projet que j'ai l'impression d'être clair, alors que je ne le suis pas du tout

    Merci d'avance pour la lecture, et éventuellement pour vos suggestions

  2. #2
    Membre chevronné Avatar de WaterTwelve21
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2015
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2015
    Messages : 270
    Par défaut
    Bonjour ,

    parfois je suis tellement dans le projet que j'ai l'impression d'être clair, alors que je ne le suis pas du tout
    J'ai l'impression qu'on est un peu dans cette situation . Je ne comprend pas pourquoi tu fais un classe à part pour le backgroundWorker mais a vrai dire cela te regarde , En effet si tu fais un new Form1 , cela va créer une nouvelle instance de Form1. Pour travailler sur la Fenetre d'origine il suffit de lui passer en paramètre de ton backgroundWorker .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void btnValider_Click(object sender, EventArgs e)
            {
                label1.Text = "En attente de validation ...";
                Background_Worker bw = new Background_Worker(this);
                bw.Start();
     
            }
    Ensuite dans ton BW , tu peux faire par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     private BackgroundWorker bw = new BackgroundWorker();
            public Form1 Form1 { get; set; }
     
            public Background_Worker(Form1 form)
            {
                Form1 = form;
                bw.WorkerReportsProgress = false;
                bw.WorkerSupportsCancellation = true;
                bw.DoWork += bw_DoWork;
                bw.ProgressChanged += bw_ProgressChanged;
                bw.RunWorkerCompleted += bw_RunWorkerCompleted;
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
     
                Form1.WindowState = System.Windows.Forms.FormWindowState.Maximized;
                MessageBox.Show("Fenêtre agrandie !");
     
            }
    Bonne chance pour la suite .

  3. #3
    Candidat au Club
    Homme Profil pro
    Informatique industriel
    Inscrit en
    Octobre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Informatique industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 2
    Par défaut
    Merci pour la réponse

    A vrai dire j'ai utilisé un BW car je ne savais pas quoi utiliser d'autre, mais sur un autre forum quelqu'un m'a parlé d'un timer, cela semble plus approprié!

    Finalement pour régler mon problème, j'ai simplement copier/coller mon code directement dans la class de mon code, et cela a forcément réglé le problème!

    Mais merci pour ta solution, c'est ce que je souhaitais faire sans savoir comment m'y prendre, je vais donc pouvoir l'appliquer.

    Merci encore

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

Discussions similaires

  1. arret Background worker thread
    Par ricky78 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 06/02/2007, 12h15
  2. SPRING+STRUTS+HIBERNATE. Une bonne solution ?
    Par ollivier dans le forum Struts 1
    Réponses: 9
    Dernier message: 10/04/2006, 13h16
  3. [JAR]Bonne solution ?
    Par Baptiste Wicht dans le forum Eclipse Java
    Réponses: 10
    Dernier message: 30/01/2006, 13h08
  4. [Algnement dans StringGrid] Voici la Bonne Solution
    Par touhami dans le forum Composants VCL
    Réponses: 1
    Dernier message: 07/11/2005, 13h35
  5. [Débutant] Bonne solution ?
    Par Machjaghjolu dans le forum Débuter
    Réponses: 23
    Dernier message: 17/09/2004, 09h51

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