Question

J'utilise C # avec Compact Framework 2, SP2.

Le système d'exploitation de l'appareil a été configuré pour démarrer avec ma demande, appelons l'application "loader.exe."

Le chargeur est simplement ceci: une forme unique et simple qui affiche les messages d'état tout au long du chargement, si nécessaire (conditions de layman pour qu'il s'agisse d'une erreur et d'un message d'exception, ou "Application de départ [xyz]") et une machine d'exécution en arrière-plan alors qu'une forme de base en plein écran est affichée.

Le constructeur de formulaire de SO Loader présente les éléments suivants à la très extrémité:

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;
}

et "runstatemachine" fonctionne sur un fil différent de celui de l'interface utilisateur, permettant ainsi à la forme d'afficher et de tout moment à la runstatemachine doit interagir avec le formulaire, telles que la mise à jour des messages, j'appelle une fonction qui utilise si (cette.invokequiitée ) {this.invoke (...);} else {...}

Alors, mon problème?
Intermittenaire, mon programme sera suspendu et c'est parce que la minuterie n'a pas déclenché un rappel. J'ai ajouté dans le message de débogage dans le bloc d'essai ci-dessus, ainsi que de nombreux autres endroits pour me dire où il a raccroché, y compris un message au début de "runstatemachine". Finalement, mon programme accroché sur le message "Démarrage de l'interface GUI Init ..."

Cela me dit que la minuterie de thread ne fonctionne pas la fois une fois dont j'en ai besoin.
Ma théorie est que c'est être des ordures recueillies avant la minuterie déclenchant le rappel. Cela signifierait si la minuterie était globale, puis éliminée explicitement lorsque je me rende à RunstaTemachine, qu'il fonctionnera parfaitement ... mais je ne veux pas penser que j'ai résolu cela juste pour trouver cela à venir par intermittence par mois.

pensées?

Était-ce utile?

La solution

Ma théorie est que c'est être des ordures recueillies avant la minuterie déclencher le rappel.Cela signifierait si la minuterie était globale, et ensuite éliminé explicitement quand je vais à la runstatemachine, que cela va courir parfaitement ... mais je ne veux pas penser que je résolvai ça juste de trouver cela à venir par intermittence par mois à partir de maintenant.

On dirait que vous voulez confirmer que c'est votre problème. oui, c'est le problème.

La minuterie est stockée dans une variable locale qui n'est jamais utilisée plus jamais.Cela le rend admissible à GC.Le GC'ing de la minuterie conduit à la finalisation menant à la minuterie d'être désactivée.

Je vous suggère de stocker la minuterie dans un champ d'instance de votre classe de formulaire et de la retirer de là une fois que le rappel a tiré.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top