Tuesday 31 January 2017

Redirectstandardoutput Waitforexit C #

J'ai une application qui appelle un autre processus dans une fenêtre de commande et ce processus a des stats de mise à jour qui sortent à la fenêtre de console. J'ai pensé que c'était une opération assez simple, mais je ne peux pas semblent le faire fonctionner. Est-ce que je manque quelque chose Idéalement ce que je voudrais est comme les changements de rendement dans ce processus que j'ai frappé ou les données entrent dans le lecteur que j'obtiens des événements hors de lui. N'importe quelle aide serait grande, je me sens comme ceci est une question de débutant mais semble manquer quelque chose. A demandé Jul 17 09 at 22:33 Ive connu cela avant. Parfois, la façon dont le processus youre appelant sorties vers la console n'est pas compatible avec ce type de redirection de sortie. Ive été assez chanceux dans ce cas pour être en mesure de modifier le processus externe pour contourner ce problème. Vous pouvez essayer d'exécuter votre code sur un autre processus qui sort vers la console et voir si cela fonctionne correctement. Ça me dit que je suis en ce moment. Je suis allé et tiré un bloc de code Ive utilisé pour ce faire. C'est dans une application WPF qui redirige la sortie du processus vers la fenêtre. Notez la liaison d'événement. Puisqu'il s'agit de WPF je dois appeler mon appel pour écrire les données. Puisque vous n'êtes pas inquiet au sujet du blocage, ou devriez être capable de simplement le remplacer par: Espérons qu'il aide Fait intéressant, vous ne pouvez pas lire à la sortie standard et l'erreur standard en même temps: si vous redirigez la sortie standard et l'erreur standard, , Par exemple en utilisant le code C suivant. String output p. StandardOutput. ReadToEnd () erreur de chaîne p. StandardError. ReadToEnd () Dans ce cas, si le processus enfant écrit un texte à l'erreur standard, il bloquera le processus, car le processus parent ne peut pas lire à partir de l'erreur standard jusqu'à ce qu'il ait Terminé la lecture de la sortie standard. Toutefois, le processus parent ne lira pas de sortie standard jusqu'à ce que le processus se termine. Une solution recommandée à cette situation est de créer deux threads afin que votre application peut lire la sortie de chaque flux sur un thread. Elina séparée: merci pour votre réponse. Certaines notes au bas de cette doc MSDN (msdn. microsoften-uslibraryhellip) avertissent des potentiels blocages si vous lisez à la fin des flux stdout et stderr redirigés de manière synchrone. Il est difficile de dire si votre solution est susceptible à ce problème. En outre, il semble que vous envoyez le process39 stdoutstderr sortie en arrière en entrée. Pourquoi. ) Ndash Matthew Piatt Sep 26 16 at 4:42 Il s'agit d'une solution plus moderne, attendue, Task Parallel Library (TPL) pour. NET 4.5 et plus. Usage Example Réponse de l'implémentation Oct 5 16 at 10:54 I chose que c'est simple et mieux approche (nous n'avons pas besoin AutoResetEvent): Répondue 14 juin à 14h29 Vrai, mais shouldn39t vous faites. File Name Chemin quotggsci. exequot quot lt Obeycommand. txtquot pour simplifier votre code trop Ou peut-être quelque chose d'équivalent à la commande quotesquot quotggsci. exequot si vous ne voulez pas vraiment utiliser un fichier obeycommand. txt séparé. Ndash Amit Naidu Jun 4 13 at 22:03 Votre solution n'a pas besoin AutoResetEvent mais vous sondage. Lorsque vous faites des sondages au lieu d'utiliser l'événement (quand ils sont disponibles) alors vous utilisez l'UC sans raison et qui indiquent que vous êtes un mauvais programmeur. Votre solution est vraiment mauvaise par rapport à l'autre utilisant AutoResetEvent. (Mais je ne vous ai pas donné -1 parce que vous avez essayé d'aider). Ndash Eric Ouellet Nov 7 14 at 18:38 J'avais le même problème, mais la raison était différente. Cela se produira toutefois sous Windows 8, mais pas sous Windows 7. La ligne suivante semble avoir causé le problème. La solution était de ne pas désactiver UseShellExecute. J'ai maintenant reçu une fenêtre popup Shell, qui est indésirable, mais beaucoup mieux que le programme d'attente pour rien de particulier à se produire. Donc, j'ai ajouté le travail suivant autour de cela: Maintenant, la seule chose qui me dérange est de savoir pourquoi cela se passe sous Windows 8 en premier lieu. J'ai essayé de faire une classe qui permettrait de résoudre votre problème en utilisant asynchrone flux lire, en prenant en compte Mark Byers, Rob, stevejay réponses. Ce faisant, j'ai réalisé qu'il y avait un bug lié au flux de sortie de processus asynchrone. Vous ne pouvez pas faire cela: Vous recevrez System. InvalidOperationException. StandardOut n'a pas été redirigé ou le processus n'a pas encore démarré. Ensuite, vous devez démarrer la sortie asynchrone lue après le processus est démarré: Faire cela, faire une condition de course parce que le flux de sortie peut recevoir des données avant de le définir en asynchrone: Alors, certaines personnes pourraient dire que vous avez juste à lire le flux avant vous Définissez-le en mode asynchrone. Mais le même problème se produit. Il y aura une condition de course entre la lecture synchrone et configurera le flux en mode asynchrone. Il n'existe aucun moyen de réaliser une lecture asynchrone sécurisée d'un flux de sortie d'un processus de la manière réelle Process et ProcessStartInfo a été conçu. Vous êtes probablement mieux en utilisant la lecture asynchrone comme suggéré par d'autres utilisateurs pour votre cas. Mais vous devez être conscient que vous pourriez manquer certaines informations en raison de la condition de course.


No comments:

Post a Comment