Я использую Microsoft Solver Foundation
в своем недавнем проекте WinForms
, чтобы решить проблему планирования.Отмена работы фонового рабочего стола
Мой метод планирования является чем-то вроде этого:
процессpublic class Scheduler
{
public void Schedule()
{
InitializeParameters();
PrepareDateFromDatabase();
ScheduleUsingMSF(); //<---- this line is black box and take a long time to execute
SaveSchedulingResultToDb();
}
}
Иногда планирование принимает (метод ScheduleUsingMSF(), что я не имеет никакого контроля над ним, займет много времени) долгое время, я использовал a 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