Что такое F# эквивалент Task.Delay(-1)?

Есть ли у F# собственный эквивалент или это единственный эквивалент? Task.Delay(-1) |> Async.AwaitTask?

1 ответ

Решение

Похоже, примеры ботов Discord, которые вы видели, использовали Task.Delay(-1) в Задаче делаем следующее:

  1. Настройте некоторые обработчики событий, чтобы при возникновении определенных событий они отвечали
  2. Вызов Task.Delay(-1) так что задача будет выполняться вечно (и будет обрабатывать эти события по мере их появления)

Я думаю, что вы захотите исследовать класс F# MailboxProcessor (лучшим введением, IMHO, является этот). Он разработан, чтобы быть асинхронным "агентом", который работает вечно. У него есть очередь входящих сообщений (любого типа, который вы хотите), и он будет ждать входящего сообщения, отвечать на это сообщение, а затем снова "засыпать" (не блокируя поток), пока не прибудет другое входящее сообщение. Все, что вам нужно сделать, это подключить события объекта DiscordClient к функциям, которые будут отправлять соответствующие сообщения вашему MailboxProcessor.

Затем вместо запуска задачи, которая использует Task.Delay(-1), ваш main функция в Program.fs можно просто запустить MailboxProcessor, настроить WaitHandle, а затем позвоните .WaitOne() на это, что будет иметь тот же эффект: ожидание вечно (без бесконечного цикла, поэтому вы не запускаете свой процессор на 100%), чтобы ваша программа бота не выходила.

И этот дизайн также позволяет вам включить команду "quit" в вашего бота: MailboxProcessor будет настроен таким образом, чтобы при поступлении этой команды "quit" он выполнял все необходимые процедуры завершения работы, а затем сигнализировал WaitHandle, чтобы сообщить Основная программа, которую пора бросить. Основная программа затем выйдет из .WaitOne() позвоните и выйдите. (Выход из основной программы также автоматически отключит все асинхронные процессы, все еще работающие, кстати).

Используя этот дизайн - MailboxProcessor, который работает вечно, и WaitHandle, который сигнализирует, когда пора завершать работу основной программы - для меня это больше похоже на идиоматический F#, чем на использование Task.Delay(-1) |> Async.AwaitTask,

Другие вопросы по тегам