我有显示长时间运行操作状态的 UI(从 ftp 下载一些文本文件)。出于我的目的,我使用 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;
}
}
以及创建 worker 的代码:
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似乎对我不起作用,因为它适用于重复操作(我想是为此创建了后台工作人员)。我是否必须出于我的目的使用线程(中止和加入),因为我应该为用户提供取消长时间运行的操作的可能性?
需要您的建议。
提前致谢。
最佳答案
您不能使用 Backgroundworker.CancelAsync()
取消长时间运行的 I/O 操作。就像 rifnl 回答的那样,DoWork 必须检查 worker.CancellationPending
并设置 e.Cancel
。
但是你也不应该使用 Thread.Abort()
。它可能会破坏您的过程。
您需要的解决方案必须以某种方式来自 provider.Synchronize();
。
PS: 和 catch { return;
太可怕了。删除整个 try/catch 并让 Bgw 处理异常。
关于c# - 取消backgroundworker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3255459/