我正在开发一个用于进行测量的Winform
应用程序。测量涉及机器人,电源等外部硬件。
由于测量本身是长时间运行的(大约20分钟),它将在后台工作中运行。
对我来说,主要的问题是如何设计测量能力。例如,如果他做错了什么,用户应该能够取消测量。但是测量不应该在任何地方取消 - 例如,在执行IO
- 通信时不允许取消。此外,如果用户取消,则应该保存shutdown
。
问题是,我不想用取消相关代码污染业务逻辑(测量)。
对此有什么好处?
我在python
中做了类似的逻辑。在那里,我将测量实现为状态机(FSM
)。每个州的过渡都是取消点。如果用户在状态运行时取消,则状态机会跳转到finish
状态,在此状态下发生安全关闭。
答案 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();
}