Tengo UI que muestra el estado de las operaciones de larga ejecución (descarga algunos archivos de texto de ftp). Para mis propósitos, uso backgroundworker y no puedo cancelar la operación.Cancelar 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;
}
}
Y el código para la creación del trabajador:
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);
}
solución proporcionada here no parece estar funcionando para mí por culpa funciona para las operaciones recurrentes (por la que se crea trabajador de fondo, supongo). ¿Debo usar hilos (abortar y unirme) para mis propósitos porque debería proporcionar posibilidades para que el usuario cancele la operación de larga ejecución?
Necesitas tu consejo.
Gracias de antemano.
Alternativamente, si es posible dar el valor Sincronizar a TimeOut, puede poner la sincronización en mientras (! E.CancellationPending) privider.Synchronize (TimeOut); // si es posible loop, mientras continúa la función que tiene actualmente. – greggorob64