Saturday, January 28, 2017

Process Beginoutputreadline Waitforexit

J'ai un problème avec la lecture de la sortie d'un processus de façon asynchrone dans C. J'ai trouvé quelques autres questions similaires sur ce site, mais ils ne m'aident vraiment. Voici ce que je fais: Créer un nouveau processus Définir startinfo - FileName, Arguments, CreateNoWindow (true), UseShellExecute (false), RedirectStandardOutput (true) Ajouter un gestionnaire d'événements à OutputDataReceived Démarrer le processus, BeginOutputReadLine puis WaitForExit (). Il fonctionne très bien, mais la sortie du processus démarré écrit quelques pourcentages () que je veux obtenir, mais je ne peux pas puisque mon code lit ligne par ligne et les pourcentages ne s'affichent pas. Voici le code actuel de mon programme: Il ya peu de choses qui se mettent en travers. L'application de console utilise probablement b backspace pour écraser le pourcentage, peut-être pas flushing au flux stdout après chaque écriture, et le BeginOutputReadLine attend vraisemblablement la fin de ligne avant de vous donner des données. Voir comment vous obtenez sur la lecture process. StandardOutput. BaseStream via BeginRead (ce code n'est pas async correcte et le bs aura besoin traitées différemment si votre mise en progrès dans un formulaire): Répondre Mar 2 12 at 13:06 Process. WaitForExit () will Attendez que la lecture du flux d'erreur de sortie asynchrone soit terminée. Malheureusement, cela n'est pas vrai pour la surcharge Process. WaitForExit (timeout). C'est ce que la classe Process fait en interne: Donc, il attendra les lectures asynchrone seulement s'il n'y avait pas de délai Pour le fixer, il suffit d'appeler le WaitForExit (waitout) sans paramètre après WaitForExit (timeout) retourné vrai: Elina: 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