2009-06-25 6 views
1

J'utilise thread qui recevra des messages de l'application externe .Pour que mon fil shud être toujours en vie.Comment garder le fil en vie tout au long de l'application Windows C#

Je souhaite que mon thread s'exécute dans l'application, jusqu'à ce que l'application se termine. Actuellement, j'appelle mon fil dans le programme.cs, qui est le démarrage pour Windows application C#. S'il vous plaît voir le code ci-dessous pour savoir comment je le fais.

Lorsque j'utilise le code ci-dessous, le fil démarre lorsque l'application démarre ... Mais il abandonne une certaine façon, après le thread reçoit un message de l'application externe.

J'espère que je suis clair avec ma question. S'il vous plaît aider. Merci.


static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     StartThread(); 
     Application.Run(new Screensaver()); 
    } 
    public static void StartThread() 
    { 
      DeamonEngine Deamon = new DeamonEngine(); 
      Thread ThreadReciever = new Thread(Deamon.Receiver); 
      if (!(ThreadReciever.IsAlive)) 
      { 
       ThreadReciever.Start(); 
      } 
     } 
    } 

D'un commentaire:

void Receiver() { 
     try { 
      Initiate socket s; 
      Bind Ip address; 
      s.Receiver[bytes]; 
      Access the members of message received in bytes; 
      Assign the members of message to local variable; 
      Read Xml File, get the node values and write to batch file; 
      Execute batch file. 
     } 
     catch { } 
    } 
+0

Karthik, plusieurs fois vous avez dit qu'il y a une boucle. Pourriez-vous s'il vous plaît nous montrer la boucle? Je n'en vois pas. Le code que vous avez publié s'exécutera une fois, puis le thread se terminera. –

Répondre

2

Si un thread exécute la méthode Receiver, cela ne signifie pas que le thread exécutera la méthode de manière répétée.

Étant donné le code de traitement dans la question, Daemon.Receiver doit s'exécuter dans une boucle afin qu'il puisse revenir en arrière et récupérer le prochain message à traiter.Il devrait ressembler à ceci:

void Receiver() { 
    while(!done) // without this loop, only one execution will occur 
    { 
     try { 
      // do stuff 
     } 
     catch { 
      // log/handle error 
     } 

     // wait for next message 
    } 
} 
+0

oui. Ma méthode Deamon.receiver capte le message. Son exécution d'une boucle pour le traitement du message que je reçois. Mais une fois qu'il traite le premier message, il avorte. – Anuya

+0

pouvez-vous mettre un aperçu de la méthode Deamon.Receiver? sans la logique principale bien sûr ... il suffit de laisser dans les déclarations en boucle, et les prises d'essai, etc ... –

+0

Receiver() { try { Initiate socket s; Adresse IP de liaison; s.Receiver [octets]; Accéder aux membres du message reçu en octets. Affectez les membres du message à la variable locale. Lire le fichier Xml, obtenir les valeurs de nœud et écrire dans le fichier séquentiel. Exécuter le fichier séquentiel. } attraper { } } – Anuya

2

Votre code de démarrage semble bien: mon pronostic est qu'il ya quelque chose de mal avec DaemonEngine.Receiver(), peut-être une exception est levée, ou peut-être la fonction lui-même est structuré pour ne traiter qu'un seul message ... Sans voir la fonction exacte, c'est difficile à dire.

EDIT:

Pour obtenir mes trucs de mes commentaires:

quelque chose va mal de tuer votre fil. Exception, erreur logique, je ne peux pas vous dire quoi, parce qu'il n'y a pas de code de ce qui se passe dans votre thread, mais quelque chose se passe.

De même, d'après le code que vous avez posté, vous jetez simplement le fait qu'il y avait une exception. Je n'ai pas de lien en main, mais avaler des exceptions comme ça c'est horrible. Surtout dans un fil où ils n'apparaissent pas comme d'habitude.

Il n'y a également aucune indication d'une boucle d'aucune sorte, donc ce pourrait être l'une ou l'autre de mes suggestions ci-dessus qui cause des problèmes.

+0

Ma méthode Deamon.receiver capte le message sans aucune exception. Je suis sûr de cela, parce que le traitement du premier message fonctionne bien et j'ai également débogué ligne par ligne. – Anuya

0

Votre thread peut rencontrer une exception, qui n'est pas interceptée. Essayez de mettre un try-catch dans la méthode en cours d'exécution et voyez si vous obtenez une exception.

+0

Ma méthode Deamon.receiver capte le message sans aucune exception. Je suis sûr de cela, parce que le traitement du premier message fonctionne bien et j'ai également débogué ligne par ligne. – Anuya

2

Généralement votre DaemonReceiver aurait code comme ceci

while (!quit) 
{ 
    --- do work --- 
    Thread.Sleep(1000); 
} 

Cela permet de maintenir le fil en vie jusqu'à ce que vous définissez la variable globale quit dans le thread principal.

En outre, il est très important de ne pas laisser d'exceptions sortir de votre thread. Ces exceptions ne seront signalées nulle part et provoqueront des erreurs silencieuses, probablement ce que vous vivez actuellement. Faites un tout attraper et au moins en rendre compte.

Questions connexes