Как ждать потока, не блокируя возможности пользователей использовать пользовательский интерфейс? - PullRequest
0 голосов
/ 03 июля 2019

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

Моя проблема заключается в том, что таймер истекает, а затем идет дальше.Если программа ожидает поток, клиент не может использовать пользовательский интерфейс, и если я не жду поток, программа просто пропустит и продолжит.

    public void Manager()
    {
            //Game ended
        if (!setDisplay())//Displaying all the answers and question.
            gameEnded();
        else
           startThread(); //Starting CountDown //Now the user can answer
    }

это основная часть.«setDisplay» возвращает false, когда игра закончилась, а также устанавливает интерфейс пользователя (меняет метки и т. д.)

«startThread» начинает обратный отсчет, и пользователи могут ответить с этого момента

    Action Done = () =>
    {
        //when done
        if (!currentLobby.hasAnswered)//time ran out.
        {
            currentLobby.hasAnswered = true;
            submitAnswerThread();
        }
    };

    public void startThread()
    {
        Thread t = new Thread(() => {
            try
            {
                for (var i = currentLobby.lobby.lobby.timePerQuestion; i > 0 || currentLobby.hasAnswered; i--)//TimeOut or answered.
                {
                    Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate ()
                    {
                        this.timerLabel.Content = i.ToString();//Change the label to display the correct time left.
                    }));
                    Thread.Sleep(1000);
                }
            }
            finally
            {
                Done();
            }
        });
        t.Start();
    }

Здесь, когда поток завершен, он проверяет, ответил ли пользователь уже, и если он еще не ответил, он отправит ответ (TimeOut).

Мне нужно: 1. Чтобы менеджер смотрелкаждый раз, когда заканчивается таймер 2. Делайте это так, чтобы не блокировать пользовательский интерфейс.

Заранее спасибо, Энтон.

РЕДАКТИРОВАТЬ :::: Есть ли способ, которым яможно вызвать менеджера из другого потока?!?!?это решит мою проблему!

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