【问题标题】:Sleep for x seconds before running next operation在运行下一个操作之前休眠 x 秒
【发布时间】:2016-11-24 19:18:08
【问题描述】:

我一直在尝试以各种方式让我的程序休眠 10 秒,然后再运行下一行代码。

this.SetContentView (Resource_Layout.Main)  
let timer = new System.Timers.Timer(10000.0)
async{do timer.Start()}
this.SetContentView (Resource_Layout.next)

我无法找到任何解决方案。

【问题讨论】:

  • 你试过Async.sleep吗?
  • 是的。也许我没有正确使用它。 'Async.Sleep(10000)' 给了我类型不匹配
  • 您正在创建一个异步计算,但从未真正启动它。所以它永远不会被执行。 timer.Start 永远不会发生。
  • async { ... } 视为seq { ... } 之类的表达式。它创建一个 Async 对象,但该对象尚未开始运行,正如seq { 1..10 } 将创建一个 IEnumerable,但该 IEnumerable 尚未产生任何值。这允许在创建 Async 和运行它之间分离关注点,这可以在两个不同的函数或模块中完成。这样,如果您需要在创建 Async 对象后对其进行操作(例如,通过将其包装在另一个处理异常并将其转换为错误值的 async 中),您可以这样做。启动异步是一个明确的步骤。

标签: asynchronous f# sleep


【解决方案1】:

如果您想使用async 而不是更直接的方式(创建计时器并在计时器的事件处理程序中设置内容视图),那么您需要这样的东西:

this.SetContentView (Resource_Layout.Main)  
async{
   do! Async.Sleep(10000.0)
   this.SetContentView (Resource_Layout.next) }
|> Async.StartImmediate

重点:

  • 使用do! Async.Sleep可以阻止异步计算的执行
  • 通过将SetContentView 调用移动到async 中,它将在睡眠后发生
  • 使用Async.StartImmediate,您将启动工作流 - 睡眠确保其余计算在相同的线程上下文中运行(这意味着它将在 UI 线程上运行并且代码将能够访问 UI 元素) .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-29
    • 2022-06-15
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    相关资源
    最近更新 更多