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()
方法?
有一个肮脏的黑客张贴在这个杜佩链接:[如何“完全杀死”后台工作?](http://stackoverflow.com/questions/800767/how-to-kill-background-worker-completely) –
那当然是不行的。如果你不能闯入那个黑匣子,那么你无法解决这个问题。使用电话,谈论ISolverParameters.QueryAbort –
@HansPassant:谢谢,我搜索了'ISolverParameters.QueryAbort',但没有找到任何有用的东西,你有什么关于'ISolverParameters.QueryAbort'的示例或其他? – Masoud