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 :

BackgroundWorker + Cross-Thread [Débutant]


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 152
    Points : 56
    Points
    56
    Par défaut BackgroundWorker + Cross-Thread
    Bonjour,
    Voici un programme pour bien comprendre le fonctionnement du bgw et éviter le cross-thread.

    J'ai un formulaire avec un textbox qui doit être mis à jour. Voici mon code, la seule mise à jour du textbox est toujours "test" et jamais "Yahoo". Pouvez-vous me dire ce je fais pour que ça ne foncionne pas ? 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.DirectoryServices;
    using ActiveDs;
    using System.Threading;
    
    namespace PCLife
    {   
        public partial class Form1 : Form
        {
            delegate void SetTextIsCallingBack(string strTextToAppend);        
            public Form1()
            {           
                InitializeComponent();            
            }
            private void BckWrk_DoWork(object sender, DoWorkEventArgs e)
            {            
                 SetNewText("Yahoo!");             Thread.Sleep(2000);
                 SetNewText("Done");             BckWrk.Dispose();
            }
    
            private void SetNewText(string strTextToAppend)
            {
                if (txtResult.InvokeRequired)
                {                
                    this.Invoke(new SetTextIsCallingBack(this.SetNewText), new object[] { strTextToAppend });                return;
                }
                else
                {
                    txtResult.AppendText("test" + Environment.NewLine);            }
            }
            private void LastLogonTimeStamp_Click(object sender, EventArgs e)
            {
                if (!BckWrk.IsBusy)
                {              
                    BckWrk.RunWorkerAsync();
                    return;
                }        }
    
            private void BckWrk_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
               // this.tbProgress.Value = e.ProgressPercentage;
               // lbPourcent.Text = (e.ProgressPercentage.ToString() + "%");
            }
    
            private void txtResult_TextChanged(object sender, EventArgs e)
            {
    
            }
    
            private void BckWrk_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
    
            }       
        }
    }

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Ca semble correct à première vue...

    Tu es sûr que le BGW est bien lancé ? Mets des points d'arrêt dans BckWrk_DoWork pour vérifier...

  3. #3
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 152
    Points : 56
    Points
    56
    Par défaut
    J'ai mis des points d'arrêts et ça passe bien dans le BckWrk_DoWork

  4. #4
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 152
    Points : 56
    Points
    56
    Par défaut
    J'ai la honte

    Si je veux avoir "Yahoo" et "Done" comme résultat, il faudrait peut être que je récupère la bonne valeur. Il est clair pourquoi j'avais que "test" qui s'affichait.

    private void SetNewText(string strTextToAppend)
    {
    if (txtResult.InvokeRequired)
    {
    this.Invoke(new SetTextIsCallingBack(this.SetNewText), new object[] { strTextToAppend }); return;
    }
    else
    {
    txtResult.AppendText("test" + Environment.NewLine); }
    }

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    arf, erreur classique

  6. #6
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 152
    Points : 56
    Points
    56
    Par défaut
    Bonjour,

    Merci d'avoir jeté un coup d’œil à me requête.
    Soyez certain que j'aurai d'autres erreurs classiques à venir

    A+

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/03/2013, 19h16
  2. [C#]Cross-thread operation not valid
    Par hrp dans le forum Windows Forms
    Réponses: 17
    Dernier message: 31/07/2007, 16h36
  3. [WinForms]BackgroundWorker et threads
    Par b4u dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 13/12/2006, 18h55
  4. [VB.NET]Erreur "invalid cross-thread operation"
    Par NicolasJolet dans le forum Windows Forms
    Réponses: 6
    Dernier message: 05/04/2006, 12h38
  5. [VB.NET 2.0] Cross-Thread Exception
    Par guillaume1998 dans le forum Windows Forms
    Réponses: 13
    Dernier message: 30/01/2006, 18h16

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