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 traitements génériques


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut BackGroundWorker et traitements génériques
    Bonjour,

    Je suis en train de faire une appli où des traitements de plusieurs secondes seront effectués. Je me remet donc à travailler avec le composant BackGroundWorker et avec une ProgressBar pour montrer que les traitements sont en cours.

    Comme le BGW sera utilisé à plusieurs moments dans l'utilisation du logiciel, j'ai eu l'idée de créer un objet MyBackGroundWorker afin de faire quelque chose de générique. C'est peut-être une mauvaise idée.. Vous me direz si ça vous choque.

    Voici l'objet en question:
    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
    64
        public class MyBackGroundWorker
        {
            private ProgressBar progressBar = null;
            private bool WorkCompleted = false;
            private BackgroundWorker worker = null;
     
     
            public MyBackGroundWorker(ProgressBar _progressBar)
            {
                this.progressBar = _progressBar;
     
                worker = new BackgroundWorker();
                worker.WorkerReportsProgress = true;
                worker.WorkerSupportsCancellation = true;
                worker.ProgressChanged += worker_ProgressChanged;
                worker.DoWork += worker_DoWork;
                worker.RunWorkerCompleted += worker_RunWorkerCompleted;
            }
     
     
     
            public void Start()
            {
                worker.RunWorkerAsync();
            }
     
            public void Stop()
            {
                if (worker.IsBusy)
                    worker.CancelAsync();
            }
     
     
     
            private void worker_DoWork(object sender, DoWorkEventArgs e)
            {
                int i = 0;
                while (!this.WorkCompleted)
                {
                    if (worker.CancellationPending) 
                        break;
     
                    worker.ReportProgress(i);
     
                    Thread.Sleep(300);
     
                    if (i < 100) 
                        i += 5; 
                    else 
                        i = 0;
                }
            }
     
            private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                this.progressBar.Value = e.ProgressPercentage;
            }
     
            private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                this.progressBar.Value = 0;
            }
     
        }
    Comme vous pouvez voir, j'ai liée une ProgressBar à l'objet pour voir l'avancement du traitement.

    J'ai deux questions:

    - Comment passer une méthode (d'une manière générique) à l'objet pour que le BGW fasse le traitement en question?

    - Comment mettre à jour la variable MyBackGroundWorker.WorkCompleted à jour une fois que le traitement est fini?

    J'ai volontairement simplifié l'objet car tout les essais que j'ai fait non pas été concluant..

    Merci de votre aide

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Tu peux passer un objet en paramètre à ton BGW. Donc tu peux passer une méthode via un object Action ou Func

  3. #3
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut
    Effectivement Je ne connaissais pas les objets Action et Func. J'ai d'abord tenté avec Action et ça a marché directement

    Voici comment je l'ai utilisé:
    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
            public void Start(Action action)
            {
                worker.RunWorkerAsync(action);
            }
     
            private void worker_DoWork(object sender, DoWorkEventArgs e)
            {
                this.IsBusy = true;
     
                IAsyncResult result = ((Action)e.Argument).BeginInvoke(null, null);
     
                int i = 0;
                while (!result.IsCompleted)
                {
                    if (worker.CancellationPending)
                        break;
     
                    worker.ReportProgress(i);
     
                    Thread.Sleep(300);
     
                    if (i < 100)
                        i += 5;
                    else
                        i = 0;
                }
     
                this.IsBusy = false;
            }
    Et ça marche parfaitement!

    Merci de ton aide

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 07/02/2012, 10h16
  2. job de traitement générique
    Par f-mory dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 18/12/2009, 19h11
  3. Arrêter un traitement BackGroundWorked
    Par bubulemaster dans le forum Windows Forms
    Réponses: 2
    Dernier message: 30/04/2008, 22h06
  4. A quoi sert le traitement générique à la fin des méthodes
    Par Lucas Panny dans le forum W4 Express
    Réponses: 7
    Dernier message: 26/07/2007, 09h57
  5. Traitements génériques
    Par Vulcanos dans le forum Langage
    Réponses: 5
    Dernier message: 10/03/2005, 14h51

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