BackgroundWorker [Résolu]

Signaler
Messages postés
98
Date d'inscription
samedi 17 septembre 2005
Statut
Membre
Dernière intervention
24 mai 2010
-
CSharpJSharp
Messages postés
98
Date d'inscription
samedi 17 septembre 2005
Statut
Membre
Dernière intervention
24 mai 2010
-
Bonjour à tous ;

Concernant les BackgroundWorker, on peut toujours annuler son traitement quand celui-ci s'exécute en boucle, simplement envoyer CancelAsync.

Ma question est si on un traitement qui ne boucle pas (un script SQL qui prend du temps, ...), exemple :

private long Treatment(BackgroundWorker worker, DoWorkEventArgs e)
{
result++;
if (worker.CancellationPending)
{
e.Cancel = true;
}
else
{
//l'instruction qui peut durer 10 minutes
MaTableTableAdapter.SelectFromMaTable(unParametre);
}
return result;
}

Si on regarde cette procédure, on a aucune chance d'exécuter l'instruction du if, puisque la procédure est exécutée une seule fois et pas de boucle.

Ma question alors, comment pourrait-on arrêter le traitement et ne pas attendre la fin d'exécution du BackgroundWorker (10 minutes)?

Merci à tous.

4 réponses

Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
Salut,

En effet, ce n'est pas possible avec le backgroundWorker de limiter le temps d'un process.
J'avais publié une source à ce sujet : http://www.csharpfr.com/codes/RESTREINDRE-TEMPS-EXECUTION-METHODE_41928.aspx


Sébastien FERRAND
Lead Developpeur
Microsoft Visual C# MVP 2005 - 2009
Messages postés
98
Date d'inscription
samedi 17 septembre 2005
Statut
Membre
Dernière intervention
24 mai 2010
1
Bonjour Sébastien ;

Je te remercie pour ta réponse qui était claire. A vrai dire, c'est ce que je craignais :s.

Merci aussi pour la source bénéfique.
Messages postés
98
Date d'inscription
samedi 17 septembre 2005
Statut
Membre
Dernière intervention
24 mai 2010
1
Bonjour Sébastien ;

Dans le code du démarrage du BackgroundWorker (bouton, ...), j'ai les instructions suivantes :

BackgroundWorker bgw = new BackgroundWorker();

bgw.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bgw_DoWork);
bgw.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.bgw_RunWorkerCompleted);
bgw.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bgw_ProgressChanged);

Puis j'appelle la méthode de traitement. Puisqu'il s'agit d'un traitement lourd, j'affiche une petite WinForm (Progression) en ShowDialog avec le temps écoulé sur un label (j'affiche le temps à l'aide de délégués, c'est connu).

Lorsque je ferme la forme Progression, elle me retourne un DialogResult avec la valeur Abort.

Maintenant vient ma question : à ce moment-là, je teste si DialogResult == Abort et je détruis mon BackgroundWorker avec bgw.Dispose();

Ca marche très bien et je peux relancer le traitement, mais je prendre ton avis dans ce sens.

Mes remerciements.
Messages postés
98
Date d'inscription
samedi 17 septembre 2005
Statut
Membre
Dernière intervention
24 mai 2010
1
Je voulais dire : Je veux prendre ton avis et non pas je prendre ;)