Comment permanent est WaitForExit (). Je veux dire, il ya quoi que ce soit une alternative peut faire pour briser l'attente sinon je vais exécuter mon thread dans une fonction distincte, et le contrôler par des variables globales. Raison - un thread CMD. EXE, avec une application console en cours d'exécution, dont nous avons besoin d'annuler avant de le fil de son cours. Voici ce que nous avons: ProcessStartInfo psi nouveau ProcessStartInfo (quotCMD. EXEquot, query) psi. UseShellExecute useShellExec psi. RedirectStandardOutput stdout psi. CreateNoWindow noWindow hbProc nouveau Process () hbProc Process. Start (psi) hbProc. WaitForExit () Use: while (hbProc. WaitForExit (someTimeout)) si (ShouldCancel) break Sur Sep 19, 5:15 am, quotMarc Gravellquot ltmarc. grav. Gt a écrit: gt Eh bien, vous pouvez utiliser: gt gt tandis que (hbProc. WaitForExit (someTimeout)) gt if (ShouldCancel) rupture gt gt gt gt gt Marc (note, il n'ya aucune raison d'appeler à la fois le nouveau Process (Psi) Ou vous pouvez utiliser: hbProc new Process () hbProc. EnableRaisingEvents true hbProc. Exited nouveau EventHandler (functionToCallAfterProcesit) hbProc. StartInfo psi hbProc. Start () autre thread-on voulez annuler l'événement: hbProc - new EventHandler FunctionToCallAfterProcesit) Dans les deux cas, il suffit d'être conscient de la condition de course potentielle entre le processus de sortie et le désir d'annuler l'attente. Le 19 septembre, à 16h11, Alistair George ltnon. xtra. co. nzgt a écrit: gt Comment permanente est Gt Raison - un thread CMD. EXE, avec une console Application en cours d'exécution, que nous avons besoin d'annuler avant de le fil de son cours. Gt Voici ce que nous avons: gt ProcessStartInfo psi nouveau gt ProcessStartInfo (quotCMD. EXEquot, requête) gt psi. UseShellExecute useShellExec gt psi. RedirectStandardOutput stdout gt psi. CreateNoWindow noWindow gt hbProc nouveau Process () gt hbProc Process. Start (psi) gt HbProc. WaitForExit () gt gt Merci, gt Alistair. Vous pouvez soit tuer le thread en cours d'exécution WaitForExit () soit utiliser la surcharge qui vous permet de spécifier un timeout bool WaitForExit (int msToWait). Si vous l'exécutez dans un fil séparé et tuez-le vous allez obtenir une exception interrompue. Vous pouvez vous assurer que le processus que vous avez commencé n'est pas encore en cours d'exécution (si c'est le cas, tuez-le). Gt Vous pouvez soit tuer le thread en cours d'exécution WaitForExit () soit utiliser la surcharge gt qui vous permet de spécifier un timeout bool WaitForExit (int gt msToWait). Si vous l'exécutez dans un thread distinct et de tuer youre gt va obtenir une exception interrompue. Vous pouvez vous assurer que le processus gt que vous avez commencé n'est pas encore en cours d'exécution (si c'est le cas, tuez-le). Gt Merci les gars avec les suggestions qui sont utiles. Indiquera quelle option a le mieux fonctionné. Al. Copie de copyright 2005-2016, TechTalkz. Tous droits réservés. 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 du 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 une 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 la condition de course.
No comments:
Post a Comment