process.standardoutput.ReadToEnd () toujours vide?
Je suis le démarrage d'une application console, mais quand je redirige la sortie standard, je reçois toujours rien!
Lorsque je n'ai pas de redirection, et CreateNoWindow
à false
je peux tout voir correctement dans la console, mais quand je la réorienter, StandardOutput.ReadToEnd()
renvoie toujours une chaîne vide.
Process cproc = new Process();
cproc.StartInfo.CreateNoWindow = true;
cproc.StartInfo.FileName = Dest;
cproc.StartInfo.RedirectStandardOutput = true;
cproc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cproc.StartInfo.UseShellExecute = false;
cproc.EnableRaisingEvents = true;
cproc.Start();
cproc.Exited += new EventHandler(cproc_Exited);
while(!stop)
{
result += cproc.StandardOutput.ReadToEnd();
}
La EventHandler cproc_exited
que des séries stop
à true
. Quelqu'un peut m'expliquer pourquoi result
est toujours string.Empty
?
source d'informationauteur alex | 2010-01-06
Vous devez vous connecter pour publier un commentaire.
Pourquoi êtes-vous en boucle? Une fois qu'il est lu jusqu'à la fin, il ne va pas être capable de lire plus de données, est-il?
Êtes-vous certain que le texte est écrit à
StandardOutput
plutôt queStandardError
?(Et oui, évidemment, vous voulez définir
RedirectStandardOutput
de vrai plutôt que de faux. J'ai supposé que c'était juste une question de vous copier la mauvaise version de votre code.)EDIT: Comme je l'ai conseillé dans les commentaires, vous devriez lire à partir de la sortie standard et l'erreur standard dans des threads séparés. Ne pas attendre jusqu'à ce que le processus a quitté - ce une impasse, où vous êtes en attente pour le processus de sortie, mais le processus est le blocage d'essayer d'écrire sur la sortie stderr/stdout parce que vous n'avez pas lu à partir de la mémoire tampon.
Sinon, vous pouvez vous abonner à la OutputDataReceived et ErrorDataReceived événements, pour éviter d'utiliser d'autres threads.
Meilleur moyen pour cela est de rediriger la sortie et attendez que les événements:
Vous avez la redirection de standard désactivé. Essayez de changer
en
L'exemple suivant de MSDN travail pour vous?
Se débarrasser de la boucle et de déplacer l'appel à
ReadToEnd
àcproc_Exited
.