2015-04-21 1 views
1

Je crée une application de périphérique à l'aide de .NET compact framework 2.0. Il y a un system.threading.timer dans mon application qui exécute du code. Ça fonctionne bien. Mon problème est lorsque je cours l'application en double-cliquant sur l'exe dans le dossier bin, le minuteur démarre et exécute tout cela fonctionne mais il ne s'arrête jamais. Il fonctionne en arrière-plan même après la fermeture de l'application en cliquant sur le bouton X ou à partir du bouton de fermeture du menu Fichier. Je ne comprends pas comment et où j'arrête ou dispose de la minuterie pour qu'elle ne fonctionne pas après la fermeture de l'application. Peut être quelque chose comme un événement form_closing dans une application de formulaire de fenêtre. J'avais beaucoup cherché dans Google mais je n'ai pas trouvé de bonne réponse.temporisateur dans l'application console

L'application est utilise pour générer une sortie numérique pour un dispositif ici est un code d'événement timer:

public static void Main() 
{ 
    // Some code related to the device like open device etc 
    // Then the timer 
    System.Threading.Timer stt = 
     new System.Threading.Timer(new TimerCallback(TimerProc), null, 1, 5000); 
     Thread.CurrentThread.Join(); 
} 

static void TimerProc(Object stateInfo) 
{ 
    // It is my local method which will execute in time interval, 
    // uses to write value to the device 
    writeDigital(1, 0); 

    GC.Collect(); 
} 

Il fonctionne bien quand je lance le code en mode débogage, arrête la minuterie quand j'arrête la programme. Mais ne fonctionne pas quand je cours l'exe.

+3

Pouvez-vous écrire du code? – Prescott

+0

"Notez que les rappels peuvent se produire après que la méthode Dispose() a été appelée, car le temporisateur met en file d'attente les rappels à exécuter par les threads du pool de threads" – Ewan

+0

@Ewan que dois-je faire? Pouvez-vous s'il vous plaît expliquer? – mahua

Répondre

1

Vous pouvez créer et disposer en Main() et le passer à toutes les méthodes qui le nécessitent?

private static void Main() 
{ 
    using (var timer = new System.Threading.Timer(TimerProc)) 
    { 
     // Rest of code here... 
    } 
} 

Plus important encore, cette ligne de code:

Thread.CurrentThread.Join(); 

ne reviendront jamais, parce que vous demandez le thread courant d'attendre le thread en cours de mettre fin. Pensez-y un instant ...;)

Donc, votre solution est probablement de simplement supprimer cette ligne de code.

+0

désolé monsieur, mais son ne fonctionne pas, la situation est toujours la même. – mahua

+0

@mahua Voir ma mise à jour. –

+0

son fonctionnement après un petit changement, j'ai mis un console.readline() là, et c'est fait .. merci monsieur – mahua

0

Tout sur GC.Collect();

Votre objet stt est utilisé une fois et après, il est indiqué qu'il doit être retiré et que sa mémoire doit être récupérée.

Si vous ne croyez pas, appelez stt.ToString(); à la fin de la fonction principale, il prolongera le stt jusqu'à la fin de la fonction principale.

Solution (s)?

  • Vous pouvez définir l'objet stt comme statique - il garantit qu'il sera en vie jusqu'à la fin de vivre de vous programmez

  • solution recommandée

    est d'utiliser GC.KeepAlive (stt); que vous pouvez appeler à la fin de la fonction principale qui empêchera le processus de détruire.