A che punto in un processo di chiusura di Windows Form fanno i controlli vengono invalidate?

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

  •  19-09-2019
  •  | 
  •  

Domanda

Recentemente ho messo un po 'di corsi per alcuni studenti universitari per i quali hanno di utilizzare una piccola e relativamente semplice libreria C # loro forniti. Lo scopo principale di questa libreria è quello di visualizzare una forma semplice che è composto da una griglia di colore (che possono manipolare), un numero di pulsanti e un'etichetta con testo.

La classe estendono fornisce una serie di metodi astratti che devono implementare, uno dei quali è chiamato updateAction e viene richiamata automaticamente a intervalli prestabiliti.

Non ho incontrato il seguente problema me stesso, ma nei laboratori di alcuni degli studenti hanno incontrato un InvalidOperationException intermittente essere gettato all'interno del proprio metodo di updateAction quando chiudono la loro forma. Il messaggio di errore è l'errore che normalmente aspettare di vedere quando si tenta e modificare l'interfaccia utente da un thread diverso, ma ci sono solo un '' virgolette dove normalmente si vede il nome del controllo incriminato.
Se questo continua ad essere un problema avremo bisogno di riemettere una versione fissa della libreria a loro se abbiamo già detto che questo errore non avrà un impatto marcatura del loro lavoro in qualsiasi modo (dal momento che sembra essere un difetto nel nostro codice) .

Per quanto posso dire agli studenti devono essere chiudendo il modulo a tal punto che l'aggiornamento è in esecuzione e controlli che modificano ottengono eliminati prima filettatura aggiornamento viene fermata cioè sembra che i controlli sono diventati nullo. La cosa strana è come intermittente è, alcuni studenti non hanno mai avuto il problema, mentre altri hanno avuto continuamente. Non ho mai incontrato personalmente per tutta la mia lo sviluppo delle soluzioni di modello per i corsi o in via di sviluppo la libreria stessa.

Quindi la mia domanda è: a che punto in un ciclo di forme di vita fanno i controlli su di esso vengono smaltiti e quindi dove sarebbe meglio mettere il codice che interrompe il filo aggiornamento? Attualmente questo codice è nelle forme metodo Dispose, sarebbe in una posizione migliore altrove?

È stato utile?

Soluzione

Come ti fermare il filo? Sei sicuro che è l'arresto prima di chiudere la finestra? È necessario assicurarsi di interrompere l'operazione impostando un flag nel ciclo thread. È quindi necessario attendere per il thread per uscire.

Discussione

while (running)
{
    // thread stuff
}

Modulo

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

Se si vuole un sistema reattivo è necessario garantire il thread è in grado di uscire in breve tempo di ottenere il segnale di arresto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top