BackgroundWorker

Résolu
CSharpJSharp Messages postés 98 Date d'inscription samedi 17 septembre 2005 Statut Membre Dernière intervention 24 mai 2010 - 6 mai 2010 à 11:06
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.

4 réponses

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
7 mai 2010 à 17:09
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
3
CSharpJSharp Messages postés 98 Date d'inscription samedi 17 septembre 2005 Statut Membre Dernière intervention 24 mai 2010 1
9 mai 2010 à 12:41
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.
0
CSharpJSharp Messages postés 98 Date d'inscription samedi 17 septembre 2005 Statut Membre Dernière intervention 24 mai 2010 1
24 mai 2010 à 16:34
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.
0
CSharpJSharp Messages postés 98 Date d'inscription samedi 17 septembre 2005 Statut Membre Dernière intervention 24 mai 2010 1
24 mai 2010 à 16:36
Je voulais dire : Je veux prendre ton avis et non pas je prendre ;)
0
Rejoignez-nous