У меня есть пользовательский интерфейс, отображающий статус длительных операций (загрузка некоторых текстовых файлов из ftp). Для моих целей я использую backgroundworker, и я не могу отменить операцию.Отменить 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;
}
}
И код для создания рабочих:
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);
}
решения при условии, here, похоже, не работает для меня beacuse это работает для повторяющихся операций (для которого создается фон рабочего, я полагаю). Должен ли я использовать потоки (прервать и присоединиться) для моих целей, потому что я должен предоставить возможность пользователю отменить длительную работу?
Нужен ваш совет.
Заранее спасибо.
В качестве альтернативы, если возможно дать значение Synchronize a TimeOut, вы можете поместить синхронизацию в в то время как (! E.CancellationPending) privider.Synchronize (TimeOut); // если возможно цикл, продолжая функцию, которую вы сейчас используете. – greggorob64