В какой момент в процессе закрытия формы Windows элементы управления недействительны?

StackOverflow https://stackoverflow.com/questions/1729152

  •  19-09-2019
  •  | 
  •  

Вопрос

Недавно я установил некоторые курсовые работы для некоторых студентов, для которых им приходится использовать небольшую и относительно простую библиотеку C#, предоставленную им. Основная цель этой библиотеки - отобразить простую форму, которая состоит из цветной сетки (которой они могут манипулировать), ряд кнопок и метки с некоторым текстом.

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

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

Насколько я могу судить, студенты должны закрывать форму в такой момент, что обновление работает, и элементы управления, которые они изменяют, получают утилизацию до того, как поток обновления будет остановлен, т.е. Похоже, элементы управления стали нулевыми. Странно то, как это прерывистое, у некоторых студентов никогда не было проблемы, в то время как у других было это постоянно. Я никогда лично не сталкивался с этим на протяжении всей разработки модельных решений для курсовых работ или в разработке самой библиотеки.

Таким образом, мой вопрос в том, в какой момент в жизненном цикле форм элементы управления утилизируются, и, следовательно, откуда лучше разместить код, который останавливает поток обновления? В настоящее время этот код находится в методе утилизации форм, будет ли он лучше размещен в другом месте?

Это было полезно?

Решение

Как вы останавливаете ветку? Вы уверены, что он останавливается, прежде чем закрыть окно? Вы должны убедиться, что вы остановите его, установив флаг в цикле резьбы. Затем вам придется подождать, пока поток выйдет.

Нить

while (running)
{
    // thread stuff
}

Форма

thread.running = false; // or use your own Stop() method that does the same thing
thread.Join();

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top