Настройка рабочего потока для непрерывной проверки значения bool объекта

#c# #winforms

#c# #winforms

Вопрос:

Я запускаю этот код в форме, но когда я его запускаю, он зависает. Это связано с тем, что while не позволяет запустить другой код. Я хочу настроить отдельный рабочий поток для этой задачи while. Однако я не знаю, как настроить рабочий поток для этой конкретной задачи.

     public void startGame(Form sender) // Form that is being send is an mdiContainer
    {

        View view = new View();
        Controller game = new Controller(view);

        view.MdiParent = sender; //Here i tell the other form it's parent is sender
        view.Visible = true;

        //problem code
        while (true) 
 //This loop is supposed to keep checking if the game has ended and if it did, close the form view.
        {
            if(game.gameOver == true)
            {
                view.Close();
                break;
            }
        }
    }
  

Комментарии:

1. Не используйте цикл. Используйте EventWaitHandle

Ответ №1:

Правильное выполнение многопоточности — непростая задача, и ее следует выполнять только в случае реальной необходимости.

У меня есть альтернативное предложение:

Ваш контроллер game вызывает событие, когда игра заканчивается:

 class Controller
{
    ...

    public event EventHandler GameFinished;

    private bool gameOver;
    public bool GameOver 
    {
        get { return gameOver; }
        set
        {
            gameOver = value;
            if (gameOver)
                GameFinished?.Invoke(this, new EventArgs());
        }
    }
}
  

Класс containing startGame добавляет обработчик к этому событию и закрывает представление при возникновении события:

 View view = new View();
Controller game = new Controller(view);

...

game.GameFinished  = (sender, e) => { view.Close(); }