为什么转换值声明而不是函数参数会导致不同的行为?

Why does casting a value declaration instead of a function argument result in different behavior?

为什么强制转换值声明而不是函数参数会导致不同的行为?

以下操作挂起:

let duration = uint32 500
...
brick.DirectCommand.TurnMotorAtPowerForTimeAsync(motors, power, duration, breakEnabled) |> ignore

以下操作成功:

brick.DirectCommand.TurnMotorAtPowerForTimeAsync(motors, power, uint32 500, breakEnabled) |> ignore

有什么区别?

代码:

let volume = 100
let frequency = uint16 1000
let duration = uint32 500
let power = 100
let motors = OutputPort.B ||| OutputPort.C
let breakEnabled = false

let moveAsync = async {

    let brick = Brick(UsbCommunication())

    brick.ConnectAsync() |> ignore
    brick.DirectCommand.TurnMotorAtPowerForTimeAsync(motors, power, duration, breakEnabled) |> ignore

    }

Async.RunSynchronously moveAsync

你做的事情很奇怪,你应该read up了解如何使用async工作流程。就是说,我所期望的 - 前提是你的功能确实 return Async<'a> - 是这样的:

let moveAsync = 
    async {
        let brick = Brick(UsbCommunication())

        do! brick.ConnectAsync() |> Async.Ignore
        let! _ = brick.DirectCommand.TurnMotorAtPowerForTimeAsync(motors, power, duration, breakEnabled)
    }

您想使用 let!do! 组成异步工作流 - 如果您有 Async<'a> 并且不关心 return 值,您可以还可以使用 Async.Ignore 将其变成 Async<unit>(而不是普通的 ignore)。

编辑: 澄清为什么我给出了这个答案 - 我什至无法想象你会遇到问题的场景如所述

但是您发布的代码显然存在问题,在我看来无法真正推断出正在发生的事情。就像在异步工作流 中 returning Tasks(可能已经启动或未启动)而不等待它们完成 。如果这段代码做的事情符合你的期望,我觉得纯属巧合。

我的直觉是,一旦你解决了这些问题,你就会发现无论你以何种方式传入 duration 参数都可以。