如何在单击取消按钮时取消DoWork中的所有方法?

时间:2017-07-13 06:59:27

标签: c# .net backgroundworker

我知道这不是关于取消BackGroundWorker的第一个问题,但我找不到解决问题的答案。

如果我单击alertbox中的cancel(中止)按钮,我需要终止Dowork方法中的所有方法。这里QueryexecutionsettingForControl方法是另一种类方法。如果我随时提供中止选项,则需要终止所有方法。

如何实现这一目标?

我目前的代码是:

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);

1 个答案:

答案 0 :(得分:1)

官方方式是使用CancellationTokenSource。您将在CancellationTokenSource中创建AlertBox的实例,然后将Token从源传递到BackgroundWorker

BackgroundWorker然后将令牌传递给它调用的所有方法。

您必须修改所有涉及的方法以接收CancellationToken作为参数,并通过调用其ThrowIfCancellationRequested方法定期检查令牌的取消状态。还要检查DoWork处理程序本身中令牌的状态。

然后,您可以通过调用Cancel上的CancellationTokenSource方法取消操作。