我有一个问题:
我在使用F#中的Async.Sleep()方法时遇到问题。这是我程序中的一段代码:
if (newAngle <> currentAngle) then
if (newAngle = 0) then
Motor(MotorPort.OutA).SetSpeed(100y)
angle1 <- Motor(MotorPort.OutA).GetTachoCount()
**Async.Sleep(20)**
angle2 <- Motor(MotorPort.OutA).GetTachoCount()
speed <- abs(angle2 - angle1)
distance <- abs(newAngle - angle2)
if (speed > 11) then
pwr <- 20L + int64 distance
if (pwr < 100L) then
Motor(MotorPort.OutA).SetSpeed(sbyte pwr)
while (distance > 30 || angle2 <> angle1) do
angle1 <- Motor(MotorPort.OutA).GetTachoCount()
**Async.Sleep(20)**
angle2 <- Motor(MotorPort.OutA).GetTachoCount()
speed <- abs(angle2 - angle1)
distance <- abs(newAngle - angle2)
if (speed > 11) then
pwr <- 20L + int64 distance
if (pwr < 100L) then
Motor(MotorPort.OutA).SetSpeed(sbyte pwr)
Motor(MotorPort.OutA).Off() //? off
**Async.Sleep(300)**
我在代码中的某些地方使用过Async.Sleep()函数。但不幸的是,当我使用Async.Sleep()方法时,我收到此错误:
This expression was expected to have type unitbut here has type Async<unit>
我该如何解决这个问题?
答案 0 :(得分:5)
在致电do!
之前,您需要Async.Sleep
,即
async{
...
do! Async.Sleep(time * 1000)
...
}
下次如何自行研究:
答案 1 :(得分:3)
Async.sleep
会回复一些&#34; async
&#34;代码。
&#34; async
&#34;计算表达式构建器允许以不依赖于单个线程的方式将计算注入新类型async<_>
和 编织 这样的计算线程池并知道如何以有效的方式暂停(和恢复!)计算。
最重要的是,主要的好处是这种计算的受控编织(以及 - 不同方面 - 控制执行)。
如果您只需要一条Async
指令,则无法编织,也无法使用async<_>
类型。如建议的那样,您可能希望使用Thread.Sleep
了解这些异步的最佳方法是将async
计算表达式解释为其连续的回调。每个计算表达式都被编译成该形式。
然后,您可以查看调用的特定操作,这些操作特定于async
计算表达式构建器。
-
不幸的是,尽管F#async
使一切成为可能,使其易于使用,但这样的功能仍然不是微不足道的,需要一些时间来理解。
我建议你先把它作为一个主题,而不是快速修复。 好的部分是理解这种技术是非常有益的,因为它使用更通用的机制,如计算表达式!
答案 2 :(得分:1)
尝试以下方法:
open System.Threading
//and wherever requires write the below mentioned code
Thread.Sleep(20000) //20000 in Milliseconds unit
答案 3 :(得分:1)
re = new RegExp(/\d{2}\/\d{2}\/\d{4}/);
"21/02/2017".match(re) /* ["21/02/2018", index: 0, input: "21/02/2018"] */
"21/2/2017".match(re) /* null */
返回Async.Sleep
次计算。你所要做的就是运行它并等到它完成:
async