BackgroundWorker [Résolu]

CSharpJSharp 98 Messages postés samedi 17 septembre 2005Date d'inscription 24 mai 2010 Dernière intervention - 6 mai 2010 à 11:06 - Dernière réponse : CSharpJSharp 98 Messages postés samedi 17 septembre 2005Date d'inscription 24 mai 2010 Dernière intervention
- 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
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 7 mai 2010 à 17:09
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

Merci sebmafate 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.