我有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;
}
}
和代碼:
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似乎不是爲我工作怎麼一回事,因爲它適用於經常性操作(爲其創建後臺工作,我想)。我是否必須爲我的目的使用線程(中止和加入),因爲我應該爲用戶提供取消長時間運行的可能性?
需要您的建議。
在此先感謝。
或者,如果有可能給出同步TimeOut值,則可以將同步置於 while(!e.CancellationPending) privider.Synchronize(TimeOut); //如果可能的話 循環,同時繼續你現在擁有的功能。 – greggorob64 2010-07-15 13:28:40