在F#中精确使用Async.Sleep()

时间:2014-12-25 15:04:43

标签: asynchronous f#

我有一个问题:

我在使用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> 

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:5)

在致电do!之前,您需要Async.Sleep,即

async{
    ...
    do! Async.Sleep(time * 1000)
    ...
}

下次如何自行研究:

  1. Bing "Async.Sleep"
  2. First result - F#Async.Sleep
  3. 的MSDN文档
  4. 查看示例代码。

答案 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