CSharpJSharp
Messages postés98Date d'inscriptionsamedi 17 septembre 2005StatutMembreDernière intervention24 mai 2010
-
6 mai 2010 à 11:06
CSharpJSharp
Messages postés98Date d'inscriptionsamedi 17 septembre 2005StatutMembreDernière intervention24 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)?
CSharpJSharp
Messages postés98Date d'inscriptionsamedi 17 septembre 2005StatutMembreDernière intervention24 mai 20101 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.