1

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

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

对我来说主要问题是如何设计可测量的。例如,如果他做错了什么,用户应该能够取消测量。但是测量不应该在任何地方都被取消——例如它不允许在执行通信时取消IOshutdown此外,如果用户取消,应该有一个保存。

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

有什么好的方法呢?

我在python. 在那里,我将测量实现为状态机 ( FSM)。每个状态转换都是一个取消点。如果用户在状态运行时取消,状态机将跳转到finish安全关闭发生的状态。

4

1 回答 1

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();
}
于 2013-04-09T16:38:04.170 回答