Похоже, что примеры ботов Discord, которые вы видели с помощью Task.Delay(-1)
, выполняют в задаче следующее:
- Настройте некоторые обработчики событий, чтобы при возникновении определенных событий ониЯ отвечу
- Позвоните
Task.Delay(-1)
, чтобы задача продолжалась вечно (и обрабатывал эти события по мере их возникновения)
Я думаю, вы захотите исследовать это класс F # MailboxProcessor (лучшее введение, ИМХО, это это ).Он разработан, чтобы быть асинхронным «агентом», который работает вечно.У него есть очередь входящих сообщений (любого типа, который вы хотите), и он будет ждать входящего сообщения, отвечать на это сообщение, а затем снова "засыпать" (не блокируя поток), пока не поступит другое входящее сообщение.Все, что вам нужно сделать, это подключить события объекта DiscordClient к функциям, которые будут отправлять соответствующие сообщения вашему MailboxProcessor.
Тогда вместо запуска Задачи, использующей Task.Delay(-1)
, ваша main
функция в Program.fs
может просто запустить MailboxProcessor, настроить WaitHandle
и затем вызвать .WaitOne()
, что будет иметь тот же эффект: ожидание вечно (без зацикливания, поэтому вы не запускаете свой процессор на 100%), чтобы ваша программа бота не выходила.
Иэтот дизайн также позволяет вам включить команду «quit» в вашего бота: MailboxProcessor будет настроен таким образом, чтобы при поступлении этой команды «quit» он выполнял все необходимые процедуры завершения работы, а затем сигнализировал WaitHandle, чтобы сообщить основномуПрограмма, которую пора бросить.После этого основная программа завершит вызов .WaitOne()
и завершит работу.(Выход из основной программы также автоматически отключит все асинхронные процессы, все еще работающие, BTW).
Используя этот дизайн - MailboxProcessor, который работает вечно, и WaitHandle, который сигнализирует, когда пора для основной программы выйти- для меня это больше похоже на идиоматический F #, чем на Task.Delay(-1) |> Async.AwaitTask
.