Запуск задачи C # останавливает интерфейс WPF - PullRequest
0 голосов
/ 30 января 2019

Я хочу создать приложение для покера на C # / WPF.Проигрыватели CPU берут свою очередь, но когда приходит время действовать пользователю, у меня возникает проблема, потому что я хочу дождаться ввода данных от игрока, но мой цикл останавливает интерфейс.Код выглядит следующим образом:

public override async void TakeTurn()
{
        await WaitForUserInput();
}

private async Task<int> WaitForUserInput()
{
    await Task.Run((() => WaitForUserInput2()));
    return 42;
}

private void WaitForUserInput2()
{
    while (BetsFinished == false || Game.PlayersRound.Contains(this))
    {
        //Loop that gets broken by user interaction
    }
}

Задание, которое я запускаю, будет прервано пользовательским вводом (нажатие кнопки установит BetsFinished в значение true), что невозможно, поскольку пользовательский интерфейс замораживается, как только вызывается TakeTurn,Код находится в классе Model, поэтому он не имеет прямой связи с View, если это имеет значение.Взаимодействие с пользователем может происходить через кнопку, привязанную к команде.

Метод TakeTurn () вызывается из моего класса покера, который определяет ход игры.

Я пробовал несколько установок(например, без ожидания перед WaitForUserInput ();), но без успеха.

Поэтому моя цель - позволить этому циклу работать без зависания пользовательского интерфейса.

1 Ответ

0 голосов
/ 30 января 2019

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

Вместо этого вам следует сохранять состояние игры в памяти, а когда пользователь нажимает кнопку Bid(или что-то еще), затем реагирует на этот пользовательский ввод, переходя в новое состояние.Можно ограничить выбор пользователя - например, если вы хотите отключить пользовательские кнопки, когда компьютерные игроки делают свой ход.Но (неправильно) использование async и await для кодирования логики ожидаемого взаимодействия требует огромного труда.

PS Для игры в покер WPF я не вижу необходимости в вводе / выводе,и, следовательно, вероятно, в вашем окончательном приложении вообще не будет async или await.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...