BackgroundWorker [Résolu]

Messages postés
98
Date d'inscription
samedi 17 septembre 2005
Statut
Membre
Dernière intervention
24 mai 2010
- - Dernière réponse : CSharpJSharp
Messages postés
98
Date d'inscription
samedi 17 septembre 2005
Statut
Membre
Dernière intervention
24 mai 2010
- 24 mai 2010 à 16:36
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.
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
29
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 152 internautes nous ont dit merci ce mois-ci

Commenter la réponse de sebmafate
Messages postés
98
Date d'inscription
samedi 17 septembre 2005
Statut
Membre
Dernière intervention
24 mai 2010
1
0
Merci
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.
Commenter la réponse de CSharpJSharp
Messages postés
98
Date d'inscription
samedi 17 septembre 2005
Statut
Membre
Dernière intervention
24 mai 2010
1
0
Merci
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.
Commenter la réponse de CSharpJSharp
Messages postés
98
Date d'inscription
samedi 17 septembre 2005
Statut
Membre
Dernière intervention
24 mai 2010
1
0
Merci
Je voulais dire : Je veux prendre ton avis et non pas je prendre ;)
Commenter la réponse de CSharpJSharp