3

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

我的调度方法是这样的:

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冻结。

当调度过程需要很长时间时,用户可能想要取消当前的调度操作并更改它们的参数并再次运行它,所以我想为它们提供取消机制,因此我使用以下代码取消操作,依据How to: Use a 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()方法?

+0

有一个肮脏的黑客张贴在这个杜佩链接:[如何“完全杀死”后台工作?](http://stackoverflow.com/questions/800767/how-to-kill-background-worker-completely) –

+1

那当然是不行的。如果你不能闯入那个黑匣子,那么你无法解决这个问题。使用电话,谈论ISolverParameters.QueryAbort –

+0

@HansPassant:谢谢,我搜索了'ISolverParameters.QueryAbort',但没有找到任何有用的东西,你有什么关于'ISolverParameters.QueryAbort'的示例或其他? – Masoud

回答

0

取消订阅属性应通过后台进程检查。如果该属性设置为true,那么您的后台工作人员应该停止其工作,免费资源,执行最终任务等。但由于您无法控制ScheduleUsingMSF();你想从中受益。