我知道这不是关于取消BackGroundWorker
的第一个问题,但我找不到解决问题的答案。
如果我单击alertbox中的cancel
(中止)按钮,我需要终止Dowork
方法中的所有方法。这里Queryexecution
和settingForControl
方法是另一种类方法。如果我随时提供中止选项,则需要终止所有方法。
如何实现这一目标?
我目前的代码是:
CancelSupportedBackgroundWorker backGroundWorker = new CancelSupportedBackgroundWorker {
WorkerSupportsCancellation = true
};
AlertBox alertBox = new AlertBox
{
WaitingText = "Loading",
WaitingHeaderText = "Loading Indicator",
};
alertBox.IsBusy = true;
alertBox.AbortButton.Click += (obj, arg) =>
{
backGroundWorker.CancelAsync();
alertBox.AbortButton.IsEnabled = false;
backGroundWorker.Abort();
backGroundWorker.Dispose();
};
backGroundWorker.DoWork += (obj, arg) =>
{
App.Current.Dispatcher.Invoke(DispatcherPriority.SystemIdle, new Action(
delegate ()
{
try
{
query.SettingForControl();
query.QueryExecution(connectionstring);
alertBox.AbortButton.IsEnabled = false;
if (backGroundWorker.CancellationPending)
arg.Cancel = true;
}
catch (ThreadAbortException)
{
Dispatcher.Invoke(() =>
{
alertBox.IsBusy = false;
},
System.Windows.Threading.DispatcherPriority.Background);
arg.Cancel = true;
}
})
);
};
backGroundWorker.RunWorkerCompleted += (obj, arg) =>
{
if (arg.Cancelled)
{
alertBox.IsBusy = false;
return;
}
alertBox.IsBusy = false;
};
backGroundWorker.RunWorkerAsync(this);
答案 0 :(得分:1)
官方方式是使用CancellationTokenSource
。您将在CancellationTokenSource
中创建AlertBox
的实例,然后将Token
从源传递到BackgroundWorker
。
BackgroundWorker
然后将令牌传递给它调用的所有方法。
您必须修改所有涉及的方法以接收CancellationToken
作为参数,并通过调用其ThrowIfCancellationRequested
方法定期检查令牌的取消状态。还要检查DoWork
处理程序本身中令牌的状态。
然后,您可以通过调用Cancel
上的CancellationTokenSource
方法取消操作。