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?
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
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
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