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 :

utilisation de BackgroundWorker


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 38
    Par défaut utilisation de BackgroundWorker
    Bonjour,
    Je suis débutante en c#,et j'ai besoin d'aide.
    J'ai 3 fonction qui effectue un calcul trop long et j'aimerai les intégrer dans un "BackgroundWorker" afin que mon formulaire ne freeze(bloque) pas,j'ai consulté plein de tuto mais j'ai pas su comment faire.

  2. #2
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Bonjour,

    L'utilisation du BackgroundWorker est assez simple. Les traitements doivent être effectués dans le DoWork et le résultat sera retourné dans le RunWorkCompleted.

    Voici l'initialisation simple d'un backgroundworker :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BackgroundWorker bw = new BackgroundWorker();
    Son paramétrage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                bw.WorkerReportsProgress = true;
                bw.WorkerSupportsCancellation = true;
                bw.DoWork += new DoWorkEventHandler(bw_DoWork);
                bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
                bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
    WorkerReportsProgress : permet de dire que ton backgroundworker pourra retenir des informations d'avancement du traitement
    WorkerSupportsCancellation : permet de dire que le traitement de ton backgroundworker pourra être interrompu
    bw.DoWork += new DoWorkEventHandler(bw_DoWork) => l'abonnement au DoWork pour mettre ton traitement dans ta méthode bw_DoWork
    Idem pour progresschanged et RunWorkerCompleted

    Voici à quoi peuvent ressembler ces méthodes :
    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
    39
    40
            private void bw_DoWork(object sender, DoWorkEventArgs e)
            {
                BackgroundWorker worker = sender as BackgroundWorker;
     
                for (int i = 1; (i <= 10); i++)
                {
                    if ((worker.CancellationPending == true))
                    {
                        e.Cancel = true;
                        break;
                    }
                    else
                    {
                        // Perform a time consuming operation and report progress.
                        System.Threading.Thread.Sleep(500);
                        worker.ReportProgress((i * 10));
                    }
                }
            }
            private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                if ((e.Cancelled == true))
                {
                    this.tbProgress.Text = "Canceled!";
                }
     
                else if (!(e.Error == null))
                {
                    this.tbProgress.Text = ("Error: " + e.Error.Message);
                }
     
                else
                {
                    this.tbProgress.Text = "Done!";
                }
            }
            private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                this.tbProgress.Text = (e.ProgressPercentage.ToString() + "%");
            }
    Et pour lancer le traitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                if (bw.IsBusy != true)
                {
                    bw.RunWorkerAsync();
                }
    Et pour finir tu remarqueras que toute cette explication est disponible dans MSDN

  3. #3
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 38
    Par défaut
    et les fonction que j'ai créer je les mets ou?

  4. #4
    Membre très actif
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2010
    Messages : 237
    Par défaut
    j'ai mis mes fonctions(3fonction) dans le dowork et le runwork. je sais pas si c'est la qu'il faut les mettre ou pas.
    la première fonction s'exécute une fois arrivée à la deuxième l'erreur suivante apparaît:

    Opération inter-thread invalid: le controle 'chart3' à fait l'objet d'un accès a partir d'un thread autre que celui sur lequel il a été crée
    Sachant que je récupère des données saisie par l'utilisateur sur mon interface pour faire les calculs.

    une solution pour ça???

  5. #5
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Infose => Tu les mets dans le DoWork !
    Kensem => L'erreur est normale, tu tentes d'accéder à un contrôle graphique créé dans le thread UI (thread principal), tu obtiens donc une erreur d'accès inter-thread. La mise à jour des contrôles ne peuvent pas être effectués dans le doWork, il faut le faire par exemple dans le RunWorkCompleted qui lui s'exécute dans le thread appelant du backgroundworker.

  6. #6
    Membre très actif
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2010
    Messages : 237
    Par défaut
    Bon comme j'ai dis j'ai 3 fonction a appelé je les ai toutes mise dans 'runworker' comme vous m'avez expliqué,or ça marche pas.

Discussions similaires

  1. [Débutant] utilisation de BackgroundWorker
    Par geekploy dans le forum VB.NET
    Réponses: 4
    Dernier message: 15/01/2014, 00h35
  2. Comment utiliser un backgroundworker (vb.net 2005) ?
    Par Aspic dans le forum Contribuez
    Réponses: 1
    Dernier message: 23/04/2013, 17h22
  3. Exemple d'utilisation du BackgroundWorker
    Par infosam76 dans le forum Contribuez
    Réponses: 0
    Dernier message: 06/12/2012, 22h15
  4. Utilisation du BackgroundWorker
    Par jlm22 dans le forum VB.NET
    Réponses: 12
    Dernier message: 15/04/2011, 16h13

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