2013-04-09 46 views
1

我正在開發一個用於測量的Winform應用程序。測量涉及像機器人,電源等外部硬件。可取消測量算法

由於測量本身長時間運行(大約20分鐘),它將在後臺工作中運行。

對我來說,主要的問題是如何設計可測量的容器。例如,如果他做錯了某些事情,用戶應該能夠取消測量。但是測量不應該到處取消 - 例如在執行IO通信時不允許取消測量。此外,如果用戶取消,應該有一個保存shutdown

問題是,我不想用取消相關代碼污染業務邏輯(測量)。

這是什麼方法?

我在python中做過類似的邏輯。在那裏,我將測量作爲狀態機(FSM)實施。每個狀態轉換都是一個取消點。如果用戶在狀態運行時取消,狀態機會跳轉到發生安全關閉的狀態finish

+5

您仍然可以使自己的狀態機或添加一個布爾標誌,你的後臺代碼檢查的時候,它可以中止執行 – 2013-04-09 15:23:30

+1

,另請參閱[文檔關於取消託管線程] (http://msdn.microsoft.com/en-gb/library/dd997364.aspx)。 – 2013-04-09 15:44:09

回答

3

如果您決定使用BackgroundWorker(如您所建議的那樣),您應該可以使用CancellationPending屬性來確定用戶是否嘗試取消操作。你可以在你運行狀態機的狀態時檢查它。僞代碼可能看起來像:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // Get the BackgroundWorker that raised this event. 
    var worker = sender as BackgroundWorker; 

    // run the state machine 
    var machine = new Machine(); 
    while (!machine.isComplete()) { 
    if (worker.CancellationPending) { 
     machine.safeFinish(); 
    } else { 
     machine.executeNextState(); 
    } 
    } 

    // Assign the result of the computation 
    e.Result = machine.result(); 
}