L'envoi d'entrée/de l'obtention de la sortie d'une application console C#/WinForms)
J'ai un formulaire avec 3 contrôles:
- Une zone de texte pour l'utilisateur de saisir
commandes à envoyer à une console
application, - Un bouton pour confirmer les commandes à
être envoyé et - Lecture seule zone de texte pour afficher le
sortie de l'application.
Ce que je veux, c'est pour que l'utilisateur d'entrer des commandes dans la première zone de texte, appuyez sur le bouton pour passer et recevoir des commentaires par l'intermédiaire de la deuxième zone de texte.
Je sais comment les utiliser ProcessStartInfo.RedirectStandardOutput
mais, cependant, l'application se bloque lorsque j'utilise StandardOutput.ReadToEnd()
.
J'ai eu un coup d'oeil à l'asynchrone Process.BeginOutputReadLine()
mais, même si mon application n'accroche pas, de toute façon je n'obtenez pas de réponse dans la zone de texte, il ne fait absolument rien.
Voici mon code:
public partial class MainForm : Form
{
private void MainForm_Load(object sender, EventArgs e)
{
InitializeInterpreter();
}
private void InitializeInterpreter()
{
InterProc.StartInfo.UseShellExecute = false;
InterProc.StartInfo.FileName = "app.exe";
InterProc.StartInfo.RedirectStandardInput = true;
InterProc.StartInfo.RedirectStandardOutput = true;
InterProc.StartInfo.RedirectStandardError = true;
InterProc.StartInfo.CreateNoWindow = true;
InterProc.OutputDataReceived += new DataReceivedEventHandler(InterProcOutputHandler);
InterProc.Start();
}
private static void InterProcOutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
{
if (!String.IsNullOrEmpty(outLine.Data))
{
OutputTextBox.Append(Environment.NewLine + outLine.Data);
}
}
private void Enterbutton_Click(object sender, EventArgs e)
{
InterProc.StandardInput.Write(CommandtextBox.Text);
InterProc.BeginOutputReadLine();
}
}
Est-il possible que je puisse avoir cette exécution en douceur? Merci.
- <muet commentaire>vous savez que Vous pouvez le faire sans la redirection standard in/out?</muet commentaire> je suppose que vous êtes l'examen de re-direction des œuvres, mais vous n'avez pas déclaré que dans votre question.
- Pouvez-vous veuillez donner des détails sur qui?
- Par "Ce que je veux, c'est pour que l'utilisateur d'entrer des commandes dans la première zone de texte, appuyez sur le bouton pour passer et recevoir des commentaires par l'intermédiaire de la deuxième zone de texte" ne vous fait dire "entrer une commande (qui normalement exécuter dans une invite de commande/fenêtre"dos"), exécutez la commande en arrière-plan, et afficher les commandes de sortie de la deuxième zone de texte"? Si donc ignorer ce que je viens de dire.
- Yep, c'est ce que je voulais dire.
Vous devez vous connecter pour publier un commentaire.
Si vous voulez quelque chose d'interactif, j'ai eu ce code fonctionne (le vôtre modifiés, des détails sur les modifications ci-dessous)
Donc, j'ai déplacé les BeginOutputReadLine juste après le processus de démarrage. Qui assure que c'est vraiment seulement appelé une seule fois. J'ai aussi fait une invoquer nécessaire pour nettoyer appels de fil. Espérons que cela devrait fonctionner pour vous.
La meilleure solution que j'ai trouvé est:
J'ai utilisé le code quelque chose comme ceci:
Mais il n'est pas interactif. Mais si l'application est interactive, il va prendre beaucoup plus de code, de toute façon.
Où êtes-vous appeler
StandardOutput.ReadToEnd()
? Une fois, j'ai eu un problème similaire parce que j'ai été appelerProcess.WaitForExit()
avantStandardOutput.ReadToEnd()
. J'ai eu une grande quantité de l'entrée, et la sortie de la mémoire tampon est pleine avant l'achèvement et de mon processus a été bloqué.Vous devez appeler
StandardOutput.ReadToEnd()
avantProcess.WaitForExit()
.