Em que ponto de um processo de fechamento de formulário do Windows os controles são invalidados?

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

  •  19-09-2019
  •  | 
  •  

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top