Что такое F # эквивалент Task.Delay (-1)? - PullRequest
0 голосов
/ 31 мая 2018

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

1 Ответ

0 голосов
/ 31 мая 2018

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

  1. Настройте некоторые обработчики событий, чтобы при возникновении определенных событий ониЯ отвечу
  2. Позвоните 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.

...