Tuesday 22 August 2017

Waitforexit Processo C # Esempio Di Combo


Per i casi semplici, il vantaggio è principalmente convenienza. Ovviamente si hanno più opzioni (percorso di lavoro, scegliendo tra la Shell-exec, ecc) con il percorso ProcessStartInfo, ma c'è anche un metodo statico Process. Start (ProcessStartInfo). Re controllo degli errori Process. Start restituisce l'oggetto del processo, in modo da poter attendere l'uscita e controllare il codice di errore se si ha bisogno. Se si desidera catturare stderr, probabilmente si desidera uno degli approcci ProcessStartInfo. risposero 12 febbraio 11 ore 10.33 Marc Gravell 9830 650k 9679 154 9679 1803 9679 2273 Mi può fare un esempio se si deve ottenere l'oggetto e attendere l'uscita, mi sembra che there39s alcuna ragione per l'utilizzo di Process. Start () a causa della semplicità. ndash prosseek 12 Febbraio 11 alle 10.38 prosseek ok immaginare che si desidera catturare stdout e stderr, eseguirlo in un altro account user39s, e ottenere un evento quando completa. Ma sì per casi semplici, il metodo statico è più facile. ndash Marc Gravell 9830 12 febbraio 11 alle ore 10: 42I utilizzare Process. Start per avviare un file batch. Il file batch utilizza il comando START per avviare diversi programmi in parallelo e poi esce. Una volta che il file batch è fatto Process. HasExited diventa vero e Process. ExitCode contiene il codice di uscita corretta. Ma quando chiamo Process. WaitForExit () si blocca non ritorna mai. Il seguente pezzo di codice viene illustrato il problema. Si crea un file batch, inizia e poi stampe: Dovrebbe quindi stampa: ma non è mai lo fa (anche se HasExited è vero e abbiamo già un ExitCode). Ho notato che questo accade solo quando il file batch contiene i comandi START e quando standard error uscita Andor di serie vengono reindirizzate. Perché WaitForExit () mai ritornare cosa è il modo giusto di attesa per un tale processo per uscire E 'sicuro per interrogare solo Process. HasExited o può che provocano altri problemi PS. Ho appena notato che chiamare WaitForExit (100000) con un enorme timeout (che sicuramente doesnt scadono) restituisce immediatamente quando le uscite di processo. Wierd. Senza timeout si blocca. C'è una differenza fondamentale quando si chiama WaitForExit () senza un time-out, si assicura che il stdouterr reindirizzate sono tornati EOF. Questo fa in modo che you39ve leggere tutto l'output che è stato prodotto dal processo. Noi can39t vedere cosa fa quotonOutputquot, ma alte le probabilità che il vostro programma di deadlock perché fa qualcosa di brutto come supponendo che il thread principale è inattivo quando è effettivamente bloccato in WaitForExit (). ndash Hans Passant 3 novembre 14 alle 12:06 Questo sembra essere un artefatto (Id dire bug) nella specifica implementazione del trattamento asincrono basato su eventi di StandardOutput e StandardError. Ho notato che mentre ero in grado di riprodurre con facilità il problema, semplicemente eseguendo il codice che hai fornito (eccellente esempio di codice, tra l'altro.)), Il processo non ha fatto appendere a tempo indeterminato. Piuttosto, è tornato da WaitForExit () una volta che entrambi i processi figli che erano state iniziate avevano essi stessi usciti. Questo sembra essere una parte intenzionale della implementazione della classe Process. In particolare, nel metodo Process. WaitForExit (), una volta terminato attesa sulla maniglia processo stesso, si controlla se un lettore sia per stdout o stderr è stato creato in caso affermativo, e se il valore di timeout per il WaitForExit ( ) chiamata è infinita (cioè -1), il codice attende effettivamente per il flusso di fine sul lettore (s). Ogni rispettivo lettore è creato solo quando il metodo BeginOutputReadLine () o BeginErrorReadLine () viene chiamato. I flussi stdout e stderr sono essi stessi non chiuso fino a quando i processi figli hanno chiuso. Quindi, in attesa alla fine di tali flussi bloccherà finché questo non accade. Che WaitForExit () dovrebbe comportarsi in modo diverso a seconda che uno ha chiamato uno dei metodi che iniziano la lettura basata sugli eventi dei flussi o meno, e soprattutto in considerazione che la lettura di quei flussi direttamente non causa WaitForExit () a comportarsi in quel modo, crea un'incoerenza nelle API che rende molto più difficile da comprendere e utilizzare. Mentre Id chiamare personalmente questo un bug, immagino la sua possibile che il implementor (s) della classe processo sono consapevoli di questa incoerenza e ha creato apposta. In ogni caso, il work-around sarebbe leggere StandardOutput e StandardError invece di utilizzare direttamente la parte basata caso di API. (Anche se, naturalmente, se quelli del codice dovesse aspettare su quei flussi, si potrebbe vedere lo stesso comportamento di blocco fino a quando il bambino elabora vicino.) Ad esempio (C, perché Non so F abbastanza bene per schiaffeggiare un esempio di codice come questo insieme in fretta :)): Speriamo che il work-around sopra o qualcosa di simile affronterà la questione di base youve incontrare. I miei ringraziamenti a commentatore Niels Christensen Vorgaard per me dirigere alle linee problematiche nel metodo WaitForExit (), in modo da poter migliorare questa risposta.

No comments:

Post a Comment