2010-08-12 6 views
0

J'ai un processus qui doit lancer un processus fils et communiquer avec lui via une entrée et une sortie standard. Le processus enfant devrait être capable de se terminer automatiquement; Cependant, j'ai du mal à fermer correctement les cours d'eau.C# - comment fermer les flux d'entrée et de sortie standard à la sortie du processus?

Voici le code correspondant de l'enfant/processus "client":

// This is started in a separate thread 
private void watchStandardInput() { 
    string line = null; 
    do { 
     try { 
      line = Console.ReadLine(); 
     } catch (IOException) { 
      return; 
     } 
     lock (inputWatcher) { 
      switch (line) { 
       // process command 
      } 
     } 
    } while (line != null); 
} 

// This is called from the main thread 
private void updateStatus(string statusMessage) { 
    lock (inputWatcher) { 
     Console.WriteLine(statusMessage); 
    } 
} 

Et voici le code "serveur":

// This is in the main thread 
using (StreamReader sr = process.StandardOutput) { 
    while (!process.HasExited) { 
     processOutput(sr.ReadLine()); 
    } 
} 

// Finally, commands are sent in a separate thread. 

Maintenant pour le problème que j'ai : Lorsque le processus enfant est supposé se fermer, le serveur reste à sr.ReadLine() et le client reste à Console.ReadLine(). Qu'est-ce que je fais mal?

+0

Comment est-il censé se terminer? Il regarde un coup d'oeil comme il ne sort pas juste (je suppose que les deux attendent l'entrée est son état standard? Ou est-ce un état inhabituel? À un niveau brut j'imaginerais placer une propriété appelée "fermeture d'enfant" qui peut être vérifiée partout pour s'assurer qu'il n'essaie pas de lire quand il est censé se refermer mais il y a probablement des solutions plus élégantes, je n'arrive pas à faire en sorte que votre programme soit suffisamment fluide pour savoir ce qu'il est en ce moment :) – Chris

+0

est l'état standard. Le processus enfant sait quand il est censé se fermer, mais pas le parent. Je pourrais demander à l'enfant de faire un 'Console.WriteLine (" Hey je ferme ")' mais c'est moche et ça casserait le code existant. – jnylen

+0

Je devrais également mentionner que le programme de l'enfant est _trying_ pour fermer correctement - mais les discussions restent bloquées aux appels que j'ai mentionnés ci-dessus. – jnylen

Répondre

1

Assurez-vous que le thread client faisant ReadLine() a IsBackground défini sur true. Ne faites PAS un Abort()/Join() sur ce fil. Fermez simplement tous les threads non-fond. J'ai trouvé que même avec IsBackground réglé sur true, faire un Abort()/Join() sur le thread d'arrière-plan a provoqué mon application de test à attendre l'entrée, cependant, enlever Abort()/Join() et juste quitter régulièrement fonctionnait bien.

+0

J'ai été capable de faire quelque chose en appelant 'Environment.Exit' dans le processus fils quand cela était nécessaire, mais c'est une solution bien meilleure que je ne connaissais pas. Je vous remercie. – jnylen

Questions connexes