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();你想從中受益。