В какой момент в процессе закрытия формы Windows элементы управления становятся недействительными? - PullRequest
0 голосов
/ 13 ноября 2009

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

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

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

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

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

1 Ответ

1 голос
/ 13 ноября 2009

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

Тема

while (running)
{
    // thread stuff
}

Форма

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

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

...