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

3

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


2
我有点困惑 Task.Delay(-1) 何时会有用(相对于具有实用性的 Task.Delay(-1, someCancellationToken))。也许您可以解释一下为什么需要这样做,然后有人可能能够建议在 F# 中实现您的目标的更好方法,而不是使用没有取消令牌的 Task.Delay(-1) - rmunn
@rmunn 不好意思。我想使用 Task.Delay(-1) 的原因是为了在 F# 中编写 Discord 机器人。如果使用 CancellationToken 会更有意义。我之所以提到 Task.Delay(-1),是因为它几乎被所有 Discord.NET 和 DSharpPlus 机器人示例使用。这似乎是该生态系统的通用做法。 - robbie
1个回答

5
看起来你一直在看使用 Task.Delay(-1) 的Discord机器人示例,它们在任务中执行以下操作:
  1. 设置一些事件处理程序,以便在发生某些事件时进行响应
  2. 调用 Task.Delay(-1),使任务永久运行(并将处理这些事件)
我认为你需要调查的是F# MailboxProcessor类(在我看来,最好的介绍是这篇文章)。它被设计为一个异步“代理”,可以永久运行。它有一个传入消息的队列(您想要的任何类型),并且它会等待传入的消息,响应该消息,然后再次“休眠”(不阻塞线程),直到另一个传入的消息到达为止。您所需要做的就是将DiscordClient对象的事件连接到将适当消息发布到MailboxProcessor的函数上。
然后,您的 Program.fs 中的 main 函数可以启动MailboxProcessor,设置WaitHandle,然后在其上调用 .WaitOne(),这将具有相同的效果:永久等待(不在无限循环中,因此您不会将CPU使用率达到100%),以使您的机器人程序不退出。
而且,这种设计还允许您将“退出”命令纳入您的机器人中:MailboxProcessor将被设置为当该“退出”命令到达时,它将执行任何需要的关闭过程,然后发出信号以告诉主程序是时候退出了。主程序将退出 .WaitOne() 调用并退出。(顺便说一下,退出主程序也会自动关闭任何仍在运行的异步进程)。
使用这种设计——一个永久运行的MailboxProcessor和一个它在主程序退出时发出信号的WaitHandle——对我来说更像是F#的惯用方式,而不是使用 Task.Delay(-1) |> Async.AwaitTask

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接