J'ai une interface utilisateur qui affiche l'état des opérations de longue durée (téléchargement de certains fichiers texte de ftp). Pour mes fins, j'utilise backgroundworker et je ne peux pas annuler l'opération.Annuler backgroundworker
void worker_DoWork(object sender, DoWorkEventArgs e)
{
try
{
int rowIndex = (int)e.Argument;
//begin UI update
StartWaitingBar(rowIndex);
//get provider id cell
GridViewDataRowInfo row = _proivderGridView.Rows[rowIndex];
GridViewCellInfo provIdCell = row.Cells[ "ProviderId" ];
var providerData = GetProviderData(Convert.ToInt32(provIdCell.Value));
var provider = ProviderFactory.CreateProvider(providerData);
provider.Synchronize();
e.Result = rowIndex;
}
catch (Exception exception)
{
return;
}
}
et le code pour la création des travailleurs:
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.WorkerSupportsCancellation = true;
worker.RunWorkerAsync(args.RowIndex);
_syncWorkers.Add(providerId,worker);
...
var worker = _syncWorkers[providerId];
if(worker.IsBusy)
{
worker.CancelAsync();
}
else
{
worker.RunWorkerAsync(args.RowIndex);
}
solution fournie here ne semble pas fonctionner pour moi beacuse cela fonctionne pour les opérations récurrentes (pour lequel travailleur de fond est créée, je suppose). Dois-je utiliser des threads (annuler et joindre) à mes fins parce que je devrais fournir des possibilités pour l'utilisateur d'annuler une opération de longue durée?
Besoin de votre conseil.
Merci d'avance.
Alternativement, s'il est possible de donner la valeur Synchronize a TimeOut, vous pouvez mettre la synchronisation dans un while (! E.CancellationPending) privider.Synchronize (TimeOut); // si possible boucle, tout en continuant la fonction que vous avez actuellement. – greggorob64