F#中Task.Delay(-1)的等效项是什么?

rob*_*bie 3 f# asynchronous task delay

F#是否有其自己的等效项,还是仅有的等效项Task.Delay(-1) |> Async.AwaitTask

rmu*_*unn 5

看起来您一直在使用的Discord机器人示例Task.Delay(-1)正在Task中执行以下操作:

  1. 设置一些事件处理程序,以便在发生某些事件时,它们将做出响应
  2. 呼叫Task.Delay(-1)以便该任务将永远运行(并在事件发生时处理这些事件)

我认为您想研究的是F#MailboxProcessor类(最好的介绍,恕我直言,就是这个)。它被设计为永远运行的异步“代理”。它有一个传入消息队列(您想要的任何类型),它将等待传入消息,响应该消息,然后再次“进入睡眠”状态(不阻塞线程),直到另一个传入消息到达为止。您需要做的就是将DiscordClient对象的事件连接到将适当的消息发布到MailboxProcessor的函数。

然后,不用启动使用的Task Task.Delay(-1),您的main函数Program.fs可以直接启动MailboxProcessor,设置一个WaitHandle,然后对其进行调用.WaitOne(),这将具有相同的效果:永远等待(不必处于无限循环中,因此您不必以100%的速度运行CPU),因此您的机器人程序不会退出。

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

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