Thursday, March 9, 2017

Useshellexecute Waitforexit C #

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 synchroniquement. 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 4.5 et plus. Exemple d'utilisation Exécution répondu 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 à quotecho quotggsci. exequot quotggsci. exequot commande si vous ne don39t vraiment envie d'utiliser un fichier obeycommand. txt distinct. 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 démarrage du processus: En faisant cela, faites une condition de course car 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 course condition. ProcessStartInfo. RedirectStandardOutput propriété Lorsqu'un processus écrit du texte dans son flux standard, ce texte est généralement affiché sur la console. En définissant RedirectStandardOutput sur true pour rediriger le flux StandardOutput, vous pouvez manipuler ou supprimer la sortie d'un processus. Par exemple, vous pouvez filtrer le texte, le formater différemment ou écrire la sortie sur la console et un fichier journal désigné. Vous devez définir UseShellExecute sur false si vous souhaitez définir RedirectStandardOutput sur true. Sinon, la lecture du flux StandardOutput lance une exception. Le flux StandardOutput redirigé peut être lu de manière synchrone ou asynchrone. Méthodes telles que Lire. ReadLine. Et ReadToEnd effectuer des opérations de lecture synchrone sur le flux de sortie du processus. Ces opérations de lecture synchrone ne se terminent pas tant que le processus associé n'écrit pas dans son flux StandardOutput ou ne ferme pas le flux. En revanche, BeginOutputReadLine démarre des opérations de lecture asynchrones sur le flux StandardOutput. Cette méthode permet à un gestionnaire d'événements désigné (voir OutputDataReceived) de la sortie de flux et retourne immédiatement à l'appelant, ce qui peut effectuer d'autres travaux alors que la sortie de flux est dirigée vers le gestionnaire d'événements. L'application qui traite la sortie asynchrone doit appeler la méthode WaitForExit pour s'assurer que le tampon de sortie a été purgé. Les opérations de lecture synchrone introduisent une dépendance entre la lecture de l'appelant du flux StandardOutput et l'écriture de processus enfant dans ce flux. Ces dépendances peuvent provoquer des conditions de blocage. Lorsque l'appelant lit à partir du flux redirigé d'un processus enfant, il dépend de l'enfant. L'appelant attend l'opération de lecture jusqu'à ce que l'enfant écrit dans le flux ou ferme le flux. Lorsque le processus enfant écrit suffisamment de données pour remplir son flux redirigé, il dépend du parent. Le processus enfant attend la prochaine opération d'écriture jusqu'à ce que le parent lit du flux complet ou ferme le flux. La condition d'interblocage se produit lorsque l'appelant et le processus enfant attendent l'un l'autre pour terminer une opération, et aucun ne peut continuer. Vous pouvez éviter les interblocages en évaluant les dépendances entre le processus appelant et le processus enfant. Par exemple, le code C suivant montre comment lire à partir d'un flux redirigé et attendre que le processus enfant quitte. L'exemple de code évite une condition d'interblocage en appelant p. StandardOutput. ReadToEnd avant p. WaitForExit. Une condition d'interblocage peut se produire si le processus parent appelle p. WaitForExit avant p. StandardOutput. ReadToEnd et le processus enfant écrit suffisamment de texte pour remplir le flux redirigé. Le processus parent attendrait indéfiniment le processus enfant pour quitter. Le processus enfant attendrait indéfiniment que le parent lise dans le flux StandardOutput complet. Il existe un problème similaire lorsque vous lisez tous les textes à partir des flux de sortie standard et d'erreur standard. Par exemple, le code C suivant effectue une opération de lecture sur les deux flux. L'exemple de code évite la condition de blocage en exécutant des opérations de lecture asynchrone sur le flux StandardOutput. Une condition d'impasse se produit si le processus parent appelle p. StandardOutput. ReadToEnd suivi de p. StandardError. ReadToEnd et le processus enfant écrit suffisamment de texte pour remplir son flux d'erreurs. Le processus parent attendrait indéfiniment le processus enfant pour fermer son flux StandardOutput. Le processus enfant attendrait indéfiniment que le parent lise dans le flux StandardError complet. Vous pouvez utiliser des opérations de lecture asynchrone pour éviter ces dépendances et leur potentiel de blocage. Sinon, vous pouvez éviter la condition de blocage en créant deux threads et en lisant la sortie de chaque flux sur un thread distinct.


No comments:

Post a Comment