【问题标题】:Async tasks for commanding external hardware controllers用于命令外部硬件控制器的异步任务
【发布时间】:2020-12-22 17:45:11
【问题描述】:

假设我有一个舞台控制器,我想编写一个移动舞台的方法。我希望能够在舞台物理完成舞台移动后返回该方法,或者已经开始舞台移动。对于任何类型的硬件外部控制,我通常会编写带有 Task 返回的异步方法。这样,用户可以等待任务完成,例如等待阶段完成它的移动,或者只是调用 move 方法,如果需要,稍后等待返回的任务。

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

【问题讨论】:

    标签: asynchronous synchronization controls hardware


    【解决方案1】:

    这是控制器外部硬件的正确方法吗?这些方法是否应该与用于确定操作完成的单独方法同步编写?

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

    这些方法的问题是双重的。首先,它将您限制在非常线性的逻辑流程中。其次,除了成功/失败之外,它不容易提供结果。如果硬件做的事情不是按照指示做的怎么办?执行尝试执行 A 但超时等待状态 A' 到达以尝试执行 B 的逻辑有多容易?

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

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

    【讨论】:

    • 我可以看到你所说的缺点,但我不确定现在如何继续以确保我正确处理错误。带有回调的方法会更合适吗?像 MoveTo(decimal position, Action callback) 之类的东西,让调用者使用回调来确定移动何时完成?旁注:在我发布这个问题之前,我在你的博客上查看关于 Task.Ids 的信息。小世界!
    • @Vic:我会推荐一个包含来自设备的更新的 observable 或 Channel。命令仍然可以是async 并返回Task,但该任务将表示命令的发送,而不是命令完成
    猜你喜欢
    • 2013-12-11
    • 2013-01-08
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多