gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:16:19 25 4
gpt4 key购买 nike

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

最佳答案

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

  1. 设置一些事件处理程序,以便当某些事件发生时,它们会做出响应
  2. 调用 Task.Delay(-1) 以便任务将永远运行(并在这些事件出现时对其进行处理)

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

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

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

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

关于asynchronous - Task.Delay(-1) 的 F# 等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50616241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com