Asynchronous 什么';是任务的F#等价物。延迟(-1)?

Asynchronous 什么';是任务的F#等价物。延迟(-1)?,asynchronous,f#,task,delay,Asynchronous,F#,Task,Delay,F#是否有自己的等价物,或者是唯一的等价物Task.Delay(-1)|>Async.waittask?看起来您在使用Task.Delay(-1)时看到的Discord机器人示例在任务中执行以下操作: 设置一些事件处理程序,以便当某些事件发生时,它们会响应 调用Task.Delay(-1),使任务永远运行(并在事件发生时处理这些事件) 我想你要调查的是(最好的介绍,IMHO,是)。它被设计成一个永远运行的异步“代理”。它有一个传入消息队列(您想要的任何类型),它将等待传入消息,响应该消息,然后再

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

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

  • 设置一些事件处理程序,以便当某些事件发生时,它们会响应
  • 调用
    Task.Delay(-1)
    ,使任务永远运行(并在事件发生时处理这些事件)
  • 我想你要调查的是(最好的介绍,IMHO,是)。它被设计成一个永远运行的异步“代理”。它有一个传入消息队列(您想要的任何类型),它将等待传入消息,响应该消息,然后再次“进入睡眠”(不阻塞线程),直到另一个传入消息到达。您所需要做的就是将DiscordClient对象的事件连接到将向MailboxProcessor发送适当消息的函数

    然后,与其启动使用
    Task.Delay(-1)
    的任务,您的
    Program.fs
    中的
    main
    函数只需启动MailboxProcessor,设置一个,然后调用
    .WaitOne()
    ,这将产生相同的效果:永远等待(不在无限循环中,因此您不会以100%的速度运行CPU%)所以你的机器人程序不会退出

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


    使用这种设计——一个永远运行的MailboxProcessor和一个当主程序退出时发出信号的WaitHandle——比使用
    Task.Delay(-1)|>Async.WaitTask

    更像是惯用的F#,我对
    Task.Delay(-1)
    何时有用感到有点困惑。(与
    Task.Delay(-1,someCancellationToken)
    相反,后者具有实用性)。也许你可以解释一下为什么要这样做,然后有人可能会建议一种更好的方法来实现你在F#中的目标,而不是
    Task.Delay(-1)
    而不带取消标记。@rmunn我很抱歉。我之所以要使用
    Task.Delay(-1)
    是为了在F#中编写一个不协调的bot。使用
    CancellationToken
    肯定更有意义。我之所以提出
    Task.Delay(-1)
    ,是因为几乎所有Discord.NET和DSharpPlus bot示例都使用了它。它似乎对生态系统具有普遍性。