#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(); }