可取消的测量算法

时间:2013-04-09 15:18:25

标签: c# winforms design-patterns

我正在开发一个用于进行测量的Winform应用程序。测量涉及机器人,电源等外部硬件。

由于测量本身是长时间运行的(大约20分钟),它将在后台工作中运行。

对我来说,主要的问题是如何设计测量能力。例如,如果他做错了什么,用户应该能够取消测量。但是测量不应该在任何地方取消 - 例如,在执行IO - 通信时不允许取消。此外,如果用户取消,则应该保存shutdown

问题是,我不想用取消相关代码污染业务逻辑(测量)。

对此有什么好处?

我在python中做了类似的逻辑。在那里,我将测量实现为状态机(FSM)。每个州的过渡都是取消点。如果用户在状态运行时取消,则状态机会跳转到finish状态,在此状态下发生安全关闭。

1 个答案:

答案 0 :(得分:3)

如果您决定使用BackgroundWorker(如您所建议的那样),您应该能够使用CancellationPending属性来确定用户是否正在尝试取消操作。您可以在运行状态机状态时检查此项。 Psuedo代码可能类似于:

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();
}