用于命令外部硬件控制器的异步任务

Async tasks for commanding external hardware controllers

假设我有一个舞台控制器,我想编写一个移动舞台的方法。我希望能够在舞台实际完成舞台移动或已经开始舞台移动后 return 使用该方法。对于任何类型的硬件外部控制,我通常使用 Task return 编写异步方法。这样,用户可以等待任务完成,例如等待阶段完成它的移动,或者只调用移动方法,并在必要时等待 returned 任务。

这是控制器外部硬件的正确方法吗?这些方法是否应该与用于确定操作完成的单独方法同步编写?与我交谈的人似乎对使用异步方法有疑问;主要是因为他们觉得硬件控制对他们来说太不确定了。

Is this the right approach for controller external hardware? Should these kind of methods be written synchronously with with separate methods used to determine operation completed?

对于任何一种由外力驱动的系统,我都犹豫要不要使用 async。我经常看到的一个是人们尝试使用任务来表示“用户按下了这个按钮”。你的例子让我想起了这一点,但是用外部硬件代替了人。

这些方法的问题是双重的。首先,它将您限制在非常线性的逻辑流程中。其次,它不容易提供 success/fail 以外的结果。如果硬件执行的操作与指令不符怎么办?执行尝试执行 A 但随后等待状态 A' 超时以尝试执行 B 的逻辑有多容易?

请记住tasks must be completed。虽然可以使用诸如任务取消(或特定于硬件的异常)之类的方法来处理此问题,但这会使逻辑代码变得相当复杂。特别是当您考虑超时、重试和回退逻辑时。

所以,我通常避免使用任务来为那种领域建模。像 observable 这样的东西可能更合适,或者甚至只是状态更新的通道。这两者都允许硬件“推送”其状态并允许逻辑代码做出适当的响应,通常使用它自己的状态机。