取消后台worker操作

本文关键字:操作 worker 后台 取消后 取消 | 更新日期: 2023-09-27 18:02:21

我在最近的WinForms项目中使用Microsoft Solver Foundation来解决调度问题。

我的调度方法是这样的:

public class Scheduler
{
    public void Schedule()
    {
        InitializeParameters();
        PrepareDateFromDatabase();
        ScheduleUsingMSF(); //<---- this line is black box and take a long time to execute
        SaveSchedulingResultToDb();
    }
}

有时调度过程需要很长时间(ScheduleUsingMSF()方法,我对它没有任何控制,需要很长时间),我使用BackgroundWorker调用我的调度方法来防止GUI冻结。

当调度过程需要很长时间时,用户可能想要取消当前的调度操作并更改其参数并重新运行它,因此我想为他们提供一个取消机制,因此我使用以下代码来取消操作,根据如何使用后台Worker:

bw.WorkerSupportsCancellation = true;
...
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    var scheduler = new Scheduler();
    scheduler.Schedule();
}
private void buttonCancel_Click(object sender, RoutedEventArgs e)
{
    if (bw.WorkerSupportsCancellation == true)
    {
        bw.CancelAsync();
    }
}

我应该在哪里以及如何检查if ((bw.CancellationPending == true))来取消Schedule()方法?

取消后台worker操作

CancellationPending属性应由后台进程检查。如果该属性被设置为true,那么你的后台worker应该停止它的工作,释放资源,做最后的事情等等。但是,由于您无法控制ScheduleUsingMSF();,因此您希望能够从中受益。