3

Я использую 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() метод?

+0

В этой ссылке есть грязный хак: [Как полностью «убить» рабочего фонаря?] (Http://stackoverflow.com/questions/800767/how-to-kill-background-worker-completely) –

+1

Ну, это не может работать, конечно. Если вы не можете проникнуть в этот черный ящик, тогда вы не сможете это исправить. Используйте телефон, поговорите о ISolverParameters.QueryAbort –

+0

@HansPassant: спасибо, я искал о 'ISolverParameters.QueryAbort', но не нашел полезных вещей, есть ли у вас какой-нибудь образец или что-то еще о' ISolverParameters.QueryAbort'? – Masoud

ответ

0

CancellationPending Недвижимость должна быть проверена фоновым процессом. Если для этого свойства установлено значение true, ваш фоновый работник должен прекратить работу, освободить ресурсы, сделать окончательный материал и т. Д. Но поскольку у вас нет контроля над ScheduleUsingMSF(); вы хотите получить от этого выгоду.

Смежные вопросы