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

标签 asynchronous f# task delay

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/

相关文章:

python - 清除Python中的线程?

javascript - Javascript 中多个异步函数调用的优雅方式

.net - F# - 领域特定语言

f# - 展开 F# 单例区分联合元组类型

导入模块中的 F# Fable 函数未编译成 js

wpf - C#混合使用Task和Dispatcher.Invoke,为什么会停止?

javascript - async await Promise 用法永远阻塞等待

sql - SQL Azure 上的计划任务

c# - 调用异步函数的不同方式

python - downloadPage 回调函数的问题