F#是否有自己的等价物,或者是唯一等效的Task.Delay(-1) |> Async.AwaitTask
?
答案 0 :(得分:5)
看起来您使用Task.Delay(-1)
看到的Discord bot示例正在执行以下任务:
Task.Delay(-1)
以便任务将永久运行(并将在发生时处理这些事件)我认为你想要调查的是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#。