为什么转换值声明而不是函数参数会导致不同的行为?
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 参数都可以。
为什么强制转换值声明而不是函数参数会导致不同的行为?
以下操作挂起:
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 参数都可以。