取消后台操作任务

3

我最近在我的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冻结。
当调度过程需要很长时间时,用户可能希望取消当前调度操作并更改参数后重新运行,因此我想要为他们提供取消机制,因此我使用以下代码根据如何使用Background 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() 方法?


这个重复链接中有一个不太正规的技巧:如何完全“杀死”后台工作程序? - Bjørn-Roger Kringsjå
1
当然,那样是行不通的。如果你无法进入那个黑盒子,那么你就没有办法解决这个问题。使用电话,谈论ISolverParameters.QueryAbort。 - Hans Passant
@HansPassant:谢谢,我搜索了关于 ISolverParameters.QueryAbort 的内容但没有找到任何有用的信息,你是否有关于ISolverParameters.QueryAbort的示例或其他资料? - Masoud
1个回答

0

CancellationPending 属性应该由后台进程进行检查。如果该属性设置为 true,则您的后台工作程序应该停止其工作,释放资源,执行最终操作等。但是,由于您无法控制 ScheduleUsingMSF();,因此您将无法从中受益。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接