2016-10-23 6 views
1

Я программирую божество Discord, и я столкнулся с большой проблемой. Я программирую ботовую RPG, поэтому мне нужно часто писать HP игрока и вражеский hp, поэтому я сделал функцию.Discord.NET ждет наружу команды

private void showHP(CommandEventArgs e) 
{ 
    client.ExecuteAndWait(async() => 
    { 
     await e.Channel.SendMessage(userInside + " - " + player.HP); 
    }); 
} 

Этот CommandEventArgs e поступает из функции Command, так как мне нужно получить доступ к каналу, где эта команда была выполнена.

commands.CreateCommand("attack").Do(async (e) => 
{ 
    await e.Channel.SendMessage("You have attacked"); 
    showHP(e); 
} 

Все, кажется, работает очень хорошо ... Пока оно не будет выполнено. Весь бот держится, и он бесконечно ждет, поэтому я думаю, что я использовал асинхронные и ждут команды ошибочно. Если я не использую их вообще, сообщение попадает в таймаут.

+0

Или проблема в использовании discord.ExecuteAndWait? –

ответ

1

Если вы хотите, чтобы следовать правильному шаблону для асинхронного затем изменить код следующим образом:

private Task showHP(CommandEventArgs e) 
{ 
    return e.Channel.SendMessage($"{userInside} - {player.HP}"); 

} 

И сделать вызов следующим образом:

commands.CreateCommand("attack") 
      .Do(async (e) => 
      { 
       await e.Channel.SendMessage("You have attacked"); 
       await showHP(e); 
      } 

Создание задачи для запуска функции async и не ожидайте, что эта задача просто бесполезна, просто вызовите функцию async без ожидания и верните задачу, она не позволит планировщику задач разделить код на различные переключатели контекста.

+0

Это прекрасно, спасибо! : 3 –

4

client.ExecuteAndWait() блокирует контекст вызова до тех пор, пока родительский DiscordClient, (в вашем случае, client) отсоединяется.

Это не правильный способ для создания асинхронного контекста - самый простой способ сделать это было бы обернуть свой код в Task.Run, например, так:

private void showHP(CommandEventArgs e) 
{ 
    Task.Run(async() => { 
     await e.Channel.SendMessage($"{userInside} - {player.HP}"); 
    }); 
} 
+0

Еще лучше, просто с 'void showHP() {e.Channel.SendMessage ($" {userInside} - {player.HP} "); } ' – Gusman

+0

@Gusman хороший, но не особо« лучший »код OP:' async' – Jim

+0

Функция недействительна, поэтому она не будет ждать до конца задачи, вызов задачи async без ожидания имеет тот же результат, это еще больше так как больше нет возврата к ожидающему коду, так что да, это лучше. – Gusman

Смежные вопросы