什么是F#等价的Task.Delay(-1)?

时间:2018-05-31 03:35:09

标签: asynchronous f# task delay

F#是否有自己的等价物,或者是唯一等效的Task.Delay(-1) |> Async.AwaitTask

1 个答案:

答案 0 :(得分:5)

看起来您使用Task.Delay(-1)看到的Discord bot示例正在执行以下任务:

  1. 设置一些事件处理程序,以便在发生某些事件时,他们会响应
  2. 调用Task.Delay(-1)以便任务将永久运行(并将在发生时处理这些事件)
  3. 我认为你想要调查的是the F# MailboxProcessor class(最好的介绍,恕我直言,是this one)。它被设计成一个永远运行的异步“代理”。它有一个传入消息队列(你想要的任何类型),它将等待传入消息,响应该消息,然后再次“进入睡眠状态”(不阻塞线程),直到另一个传入消息到达。您需要做的就是将DiscordClient对象的事件连接到将向您的邮箱处理器发布适当消息的函数。

    然后,Task.Delay(-1)中的main函数只能启动邮箱处理器,设置WaitHandle,然后调用{{} Program.fs,而不是启动使用.WaitOne()的任务。 1}},它将具有相同的效果:永远等待(没有无限循环,所以你不要以100%运行你的CPU)所以你的机器人程序不会退出。

    该设计还允许您将“退出”命令合并到您的机器人中:将设置MailboxProcessor,以便当“退出”命令到达时,它将执行所需的任何关闭过程,然后发出WaitHandle信号告诉主程序是时候退出了。然后主程序将退出.WaitOne()调用,然后退出。 (退出主程序也将自动关闭任何仍在运行的异步进程,BTW)。

    使用这种设计 - 一个永远运行的MailboxProcessor,以及一个在主程序退出时发出信号的WaitHandle - 对我而言比使用Task.Delay(-1) |> Async.AwaitTask感觉更像是惯用的F#。