Em que ponto de um processo de fechamento de formulário do Windows os controles são invalidados?
Pergunta
Recentemente, defini alguns cursos para alguns estudantes de graduação para os quais eles precisam usar uma biblioteca C# pequena e relativamente simples fornecida a eles. O principal objetivo desta biblioteca é exibir uma forma simples que é composta por uma grade colorida (que eles podem manipular), vários botões e um rótulo com algum texto.
A classe que eles estendem fornece vários métodos abstratos que eles devem implementar, um dos quais é chamado de atualização e é automaticamente chamado em intervalos definidos.
Eu não encontrei o seguinte problema, mas em laboratórios alguns dos alunos encontraram um INVALIDOPERATION intermitente sendo jogado dentro de seu método de atualização quando fecham sua forma. A mensagem de erro é o erro que eu normalmente esperaria ver quando você tenta modificar a interface do usuário de um tópico diferente, mas há apenas uma cotação dupla ''
onde você normalmente veria o nome do controle ofensivo.
Se isso continuar sendo um problema, precisaremos reemitir uma versão fixa da biblioteca para eles, embora já tenhamos declarado que esse erro não afetará a marcação de seu trabalho de forma alguma (já que parece ser uma falha em nosso código) .
Tanto quanto posso dizer, os alunos devem estar fechando o formulário a tal ponto que a atualização está em execução e os controles que eles estão modificando são descartados antes que o thread de atualização seja interrompido, ou seja, parece que os controles se tornaram nulos. O estranho é o quão intermitente é, alguns estudantes nunca tiveram o problema enquanto outros o tiveram continuamente. Eu nunca o encontrei pessoalmente durante todo o meu desenvolvimento das soluções de modelo para o curso ou no desenvolvimento da própria biblioteca.
Portanto, minha pergunta é em que ponto de um ciclo de vida dos formulários os controles são descartados e, portanto, onde seria melhor colocar o código que interrompe o thread de atualização? Atualmente, esse código está no método de disposição de formulários, seria melhor colocado em outro lugar?
Solução
Como você está parando o tópico? Tem certeza de que está parando antes de fechar a janela? Você deve impedi -lo definindo um sinalizador no loop do thread. Você então precisa esperar o tópico sair.
Fio
while (running)
{
// thread stuff
}
Forma
thread.running = false; // or use your own Stop() method that does the same thing
thread.Join();
Se você deseja um sistema responsivo, é necessário garantir que o thread possa sair dentro de um curto período de tempo para obter o sinal de parada.