Domanda

Sto usando C # con Compact Framework 2, SP2.

Il sistema operativo del dispositivo è stato impostato per avviare la mia applicazione, chiamiamo l'applicazione "loader.exe".

Loader è semplicemente questo: un singolo modulo normale che mostra i messaggi di stato durante il caricamento, se necessario (i termini del layman per esserci un errore e un messaggio di eccezione o "Avvio dell'applicazione [xyz]) e una macchina di stato in esecuzione Sullo sfondo mentre viene visualizzata una forma di schermo intero di base.

Cos'è il costruttore della forma del caricatore ha il seguente al Molto End:

try
{
    label1.Text = "Starting GUI Init Thread...";  //debug only message
    System.Threading.Timer guiInit = new System.Threading.Timer(
        RunStateMachine, null, 2000, System.Threading.Timeout.Infinite
        );
    //callback: RunStateMachine, null argument
    //initial callback is 2000ms from this point, and doesn't run again.
}
catch (Exception ex1)
{
    label1.Text = "GUI Init Error 2";
    Failure_Label.Text = ex1.Message;
}
.

e "runstatemachine" funziona su un filo diverso rispetto all'interfaccia utente, consentendo al modulo di visualizzarlo, e in qualsiasi momento Dunstatemachine deve interagire con il modulo, come l'aggiornamento dei messaggi, chiamo una funzione che utilizza se (questo. ) {questo.invoke (...);} else {...}

Allora, il mio problema?
Intermittenzamente, il mio programma si bloccherà, ed è perché il timer non ha attivato un callback. Ho aggiunto nel messaggio di debug nel blocco tentativo sopra, insieme a molti altri posti per dirmi dove riattacca, incluso un messaggio all'inizio di "runstatemachine". Alla fine, il mio programma è appeso al messaggio "Avvio di GUI Init Thread ..."

Questo mi dice che il timer di thread non è in esecuzione il one ora di cui ho bisogno.
La mia teoria è che è la spazzatura raccolta prima del timer che attiva il callback. Ciò significherebbe se il timer fosse globale, e poi disposto esplicitamente quando arriverò a runsaremachine, che correggerà perfettamente ... ma non voglio pensare di averlo risolto solo per trovare questo arrivo in modo intermittente un mese da ora.

Pensieri?

È stato utile?

Soluzione

.

La mia teoria è che è la spazzatura raccolta prima del timer innescando il callback.Ciò significherebbe se il timer era globale, e poi disposto esplicitamente quando arrivo a runstatemachine, che lo farà Corri perfettamente ... ma non voglio pensare di averlo risolto solo per trovare Questo arriva in modo intermittente un mese da ora.

Sembra che tu voglia conferma che questo è il tuo problema. Sì, questo è il problema.

Il timer è memorizzato in una variabile locale che non viene mai usata mai più.Questo rende idoneo per GC.Il GC'ing del timer conduce alla finalizzazione che porta al timer da disabilitare.

Ti suggerisco di memorizzare il timer in un campo di istanza della classe del modulo e rimuoverlo da lì una volta che la richiamata ha sparato.

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