Monday 20 November 2017

Processo Waitforexit Standardoutput


Elina: Grazie per la risposta. Ci sono alcune note in fondo questo documento MSDN (msdn. microsoften-uslibraryhellip) che mettere in guardia sui potenziali deadlock se si legge alla fine di entrambi stdout e stderr ruscelli sincrono. It39s difficile dire se la soluzione è suscettibile di questo problema. Inoltre, sembra che si sta inviando l'uscita stdoutstderr processo39 terzino destro come input. Perché. ) Ndash Matthew Piatt 26-set-16 a 4:42 Questa è una awaitable più moderno, Task Parallel Library (TPL) soluzione basata per 4.5 e superiori. Esempio di utilizzo Attuazione risposto 5 16 ottobre alle 10:54 ho cosa che questo è semplice e l'approccio migliore (Non abbiamo bisogno AutoResetEvent): risposto 14 Giugno 12 in 14:29 Vero, ma shouldn39t essere fai. FileName Percorso quotggsci. exequot quot lt obeycommand. txtquot per semplificare il codice troppo O forse qualcosa di equivalente a quotecho comando quot Percorso quotggsci. exequot se davvero don39t desidera utilizzare un file obeycommand. txt separato. ndash Amit Naidu 4 giugno 13 alle 22:03 La soluzione non ha bisogno AutoResetEvent ma sondaggio. Quando si esegue sondaggio invece di utilizzare evento (quando sono disponibili), quindi si utilizza CPU senza motivo e che indica che sei un programmatore male. La soluzione è davvero male se confrontato con l'altro utilizzando AutoResetEvent. (Ma io non do -1 perché si è tentato di aiutare). ndash Eric Ouellet 7 nov 14 alle 18:38 mi stava avendo lo stesso problema, ma il motivo era diverso. Sarebbe tuttavia accadere in Windows 8, ma non sotto Windows 7. La seguente riga sembra aver causato il problema. La soluzione era quella di non disabilitare UseShellExecute. Ho ricevuto ora una finestra di popup Shell, che è indesiderato, ma molto meglio rispetto al programma in attesa di nulla di particolare per accadere. Così ho aggiunto il seguente work-around per questo: Ora l'unica cosa che mi dà fastidio è il motivo per cui questo accade in Windows 8, in primo luogo. risposto 13 Gennaio 15 alla 10:35 Ho provato a fare una classe che avrebbe risolto il problema utilizzando asincrono flusso di lettura, prendendo in considerazione Mark Byers, Rob, risposte stevejay. In questo modo mi sono reso conto che c'è un bug relativo al processo asincrono flusso di output di lettura. Non puoi farlo: Riceverete System. InvalidOperationException. StandardOut non è stato reindirizzato o il hasnt processo avviato ancora. Poi si deve avviare l'uscita asincrono leggere dopo il processo è iniziato: In questo modo, fare una condizione di competizione, perché il flusso di uscita in grado di ricevere i dati prima di impostare a asincrona: Poi alcune persone potrebbero dire che basta leggere il flusso prima di impostarlo asincrona. Ma lo stesso problema si verifica. Ci sarà una condizione di competizione tra il sincrono letto e impostato il flusso in modalità asincrona. Non vi è alcun modo per acheive sicura lettura asincrono di un flusso di output di un processo nel processo reale strada e ProcessStartInfo è stato progettato. Probabilmente si sta meglio utilizzando lettura asincrono come suggerito da altri utenti per il vostro caso. Ma si deve essere consapevoli che si potrebbe perdere un po 'di informazioni a causa di condizioni di gara System. Diagnostics. Process Classe 8211 parte 1 e Process. WaitForExit evento. Exited aren8217t lavoro pensavo di aver scoperto che questo è il caso, ma è stata colpa mia, probabilmente lo stesso anche per te. Voglio andare oltre ciò che ho trovato durante l'esplorazione e la risoluzione di questo problema. Risposta breve: metodi Se si reindirizza StandardOutput Andor StandardError, miglior uso della Process. BeginErrorReadLine asincrono () e. BeginOutputReadLine () prima di chiamare. WaitForExit () e catturare l'uscita agganciando il Process. ErrorDataReceived ed eventi. OutputDataReceived. La risposta lunga inizia con me utilizzando il Studio diffmerge. exe visiva nella cartella Common7IDE per confrontare i file di testo in modalità batch. Sto introducendo un test di regressione in un processo batch di compilazione iniziati. Avevo bisogno di uno strumento che sputare fuori un file di testo differenza quando si confrontano due file (non è un file risultato della fusione). WinMerge e senza paragoni sono a mia disposizione, ma essi non sembrano producono nulla, ma fuse risultati (che normalmente è quello che voglio, ma non questa volta). Il mio quadro di regressione chiamerà diffmerge. exe e memorizzare il file diff risultante per la revisione successiva. Ho codificato il mio ProcessStartInfo seguito con dando il via al processo e in attesa del processo per terminare. e in attesa di attesa di attesa. Questo mi ha fatto leggere MSDN e scavare più in profondità l'uso della classe Process. Ho scoperto alcune informazioni interessanti, probabilmente avrebbe dovuto essere ovvio. In primo luogo, ho scoperto che a volte si esegue il mio processo Bambino DiffMerge con argomenti diversi ha lavorato, a volte non ha ancora, rendendo il problema misterioso. In secondo luogo, ho scoperto che ha funzionato bene quando ho didn8217t reindirizzare l'output. Così, ovviamente mi mancava qualcosa. Avevo bisogno di leggere effettivamente la documentazione API di processo, e quindi ho trovato questo pepita: articolo MSDN Dopo l'individuazione e la lettura che MSDN articolo che ho capito. Il mio esempio di codice sopra funziona se il StdOut o stderror tampone doesnt si riempiono. Tuttavia quello che stavo vedendo era il buffer StdOut riempiendo, il processo figlio è stato bloccato sulla prossima StdOutStdError scrittura, il processo padre era in attesa all'infinito sul processo di bambino per uscire prima di leggere dal buffer StdOutStdError. A me sembrava che evento metodo WaitForExit Andor Exited sono rotti non cattura il processo figlio in uscita, ma è stato il mio codice che è stato rotto. Ho modificato il codice per utilizzare i metodi asincroni e improvvisamente i miei problemi andato via. Non più il blocco, tutto ha funzionato come previsto. Ho usato StringBuilders come buffer per contenere i dati ricevuti negli eventi. Nella parte 2, mi imbatto in un problema con il processo di StdOutStdError ReadLine implementazioni in tutto le mie esigenze specifiche, vado in quanto ho risolto tale questione.

No comments:

Post a Comment