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 et Propagation d'événement


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 2
    Par défaut BackgroundWorker et Propagation d'événement
    Bonjour,

    j'ai une petite question je pose le context :

    j'ai un formulaire classique windows dans le quel j'instantie un BackgroundWorker afin d'éffectuer des traitement assez lourds (nombreux accès sur BDD + écriture de fichiers XML volumineux)

    dans le DoWork du BackgroundWorker j'instantie des couches métiers permettant l'accès aux données ces couches métiers implémentes des événements (parfaitement récupérable dans le DoWork)
    mais la je sèche comment puis-je propager ces événements sur mon formulaire windows ?

    en effet le DoWork s'éxécutant de façon asynchrone (je pense donc dans un thread ddiffèrent) je n'est pas accès aux objets de mon formulaire dans la méthode associé à l'événement remonté

    pour clarifier un peu voici un extrait de mon code :
    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
     
            private void ExportXmlMessage_Load(object sender, EventArgs e)
            {
                bck.DoWork += new DoWorkEventHandler(bck_DoWork);
                bck.WorkerReportsProgress = true;
                bck.ProgressChanged += new ProgressChangedEventHandler(bck_ProgressChanged);
                bck.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bck_RunWorkerCompleted);
                bck.RunWorkerAsync(new argBCK(_id_message,_typemessage,_version));
            }
     void bck_DoWork(object sender, DoWorkEventArgs e)
            {
     
                EDICOTBusiness.EDICOTSecurity es = new EDICOTBusiness.EDICOTSecurity();
                SqlConnection connMessage = es.EDICOTConnTampon(_typemessage + _version);
                EDICOTBusiness.cheminsEchanges chm = new EDICOTBusiness.cheminsEchanges(_typemessage, 0, GlobalParameter.LogisEDICOTConnexion,GlobalParameter.numeroposte);
                EDICOTBusiness.EExport_XML Exml = new EDICOTBusiness.EExport_XML(chm.repTemplate, chm.repOut, connMessage, GlobalParameter.LogisEDICOTConnexion, _typemessage, _version);
                Exml.Notification+=new EDICOTBusiness.EExport_XML.NotificationHandler(Exml_Notification);
                try
                {
                    Exml.InitialiseData(_id_message, 1);
                    string filename = Exml.ExportMessage(_id_message);
     
                }
                catch (Exception exp)
                {
                    ETraces.trace Trace = new ETraces.trace(GlobalParameter.LogisEDICOTConnexion);
                    Trace.WriteTrace(70018, _id_message.ToString(), exp.Message);
     
                }
                finally
                {
                    connMessage.Close();
                }
            }
     
    void Exml_Notification(object d, EDICOTBusiness.EvtInfos e)
            {
                try
                {
                    msg.Text += e.message;
                }
                catch(Exception ex)
                {
                    throw ex;
                }
            }
    si quelqu'un à déjà rencontrer le problème ou que vous pouviez m'aider je vous en serais très reconnaissant

    cordialement,

    Franck

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 134
    Par défaut
    Dans le dowork, tu appelle la méthode myBackgroundworker.ReportProgress à laquelle tu peux passé 2 paramètre, le pourcentage d'avancement du traitement dans le DoWork et en deuxième paramètre tu peux passer n'importe quelle type d'objet ce qui te donne

    myBackgroundworker.ReportProgress(int percent, object ce_que_tu_veux)

    je sais pas si ca va t'aider mais voila

  3. #3
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    Si tu veux dialoguer avec un thread différent, tu peux utiliser les appels inter-threads.
    Voilà un exemple d'appel inter-thread avec un backgroundworker : Comment : faire des appels thread-safe aux contrôles Windows Forms

  4. #4
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 2
    Par défaut
    meric de ta réponse freerider74,
    j'ai effectivement réussit a remonter mon informations mais je le le fais pas par le coupe evenement / delegate

    j'ai tout simplement passé mon backGroundWorker en paramètre à mon objet le plus profonds et j'éffectue un reportProgress directement à partir de celui-ci.

    je n'arrive pas bien a savoir si cela est propre.

    donc si vous avez plus d'informations sur comment propager un événement d'une classe instancier dans le dowork d'un background worker dans le thread qui à initier le backgroundWorker

    je suis preneur

    cordialement,

    Franck

  5. #5
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    Citation Envoyé par Agrock Voir le message
    j'ai tout simplement passé mon backGroundWorker en paramètre à mon objet le plus profonds et j'éffectue un reportProgress directement à partir de celui-ci.

    je n'arrive pas bien a savoir si cela est propre.
    Ce n'est pas ce qu'il y a de plus propre. En règle générale, il faut tâcher de garder les couches métier et interface le plus indépendantes l'une de l'autre.

    Citation Envoyé par Agrock Voir le message
    donc si vous avez plus d'informations sur comment propager un événement d'une classe instancier dans le dowork d'un background worker dans le thread qui à initier le backgroundWorker

    je suis preneur
    Cf mon post :
    Citation Envoyé par Skalp Voir le message
    Si tu veux dialoguer avec un thread différent, tu peux utiliser les appels inter-threads.
    Voilà un exemple d'appel inter-thread avec un backgroundworker : Comment : faire des appels thread-safe aux contrôles Windows Forms

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/10/2009, 10h01
  2. Propager un événement depuis un composant à un autre composant
    Par BaldeckJ dans le forum Composants VCL
    Réponses: 2
    Dernier message: 11/09/2008, 14h43
  3. [Maj pb] Propagation d'évènement au niveau supérieur
    Par seiryujay dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 26/06/2006, 15h05
  4. [MAJ]Problème de propagation d'évènement + Key Binding
    Par seiryujay dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 23/06/2006, 16h19
  5. [C# 2.0] Propagation d'évènement
    Par l0k1 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 18/05/2006, 14h37

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