Sunday 15 October 2017

Timeout Waitforexit


Il codice assomiglia quasi questo: Come si può vedere, il codice avvia un processo cmd. exe e passa ad essa il comando che voglio da eseguire. Rioriento StandardError e StandarOutput per leggerli dal codice. Il codice li legge prima del processo. WaitForExit (Timeout) chiamata come raccomandato da Microsoft (ne parleremo più avanti). Il problema sorge se il comando mando a cmd. exe non termina o si blocca a tempo indeterminato. Nel codice che ho usato il comando ping - t 8.8.8.8 che, a causa del l'opzione - t, ping l'ospite senza fermarsi. Cosa succede Il processo cmd. exe insieme con il comando - t ping mai uscite e non chiude mai il flusso stdout e così il nostro codice si blocca al () Linea process. StandardOutput. ReadToEnd uscita perché cant riescono a leggere tutto il flusso. Lo stesso accade anche se un comando in un file batch si blocca per qualsiasi motivo e in modo che il codice di cui sopra potrebbe funzionare continuamente per anni e poi appendere improvvisamente senza alcun motivo apparente. Prima ho scritto che la sua consiglia di leggere i flussi reindirizzate prima del processo. WaitForExit (Timeout) chiamata, e questo è particolarmente vero se si utilizza la firma WaitForExit senza il timeout. Se si chiama processo. WaitForExit () prima di leggere i flussi reindirizzati: codice 2: si può sperimentare un deadlock se il comando si collega alla cmd. exe o il processo che si sta chiamando riempie l'output standard o standard error. Questo perché il nostro codice sopraelevazione raggiungere le linee di processo di uscita. StandardOutput. ReadToEnd () È un dato di fatto del processo figlio (il comando ping o un file batch o un processo che si sta eseguendo qualsiasi altra cosa) potete andare sul se il nostro programma di doesnt leggere i buffer piene dei corsi d'acqua e questo cant accadere perché il codice è appesa a la linea con processo. WaitForExit (), che aspettare per sempre per il progetto figlio per uscire. La dimensione predefinita di entrambi i flussi è di 4096 byte. È possibile verificare questo due dimensioni con questi file batch: Il primo script scrive 4096 byte standard output e il secondo di errore standard. Salvare uno di questi in C: testbuffsize. bat ed eseguire il nostro processo di programma chiamante. WaitForExit () prima del processo di uscita. StandardOutput. ReadToEnd (), come nel codice 2. è possibile farlo scrivendo CommandResult Risultato ExecuteShellCommandSync (c: testbuffsize. bat, 1000) alla riga 13 del codice 1. Il codice solito appendere ma se si scrive un altro byte in uno qualsiasi dei due corsi d'acqua che sarà traboccare la dimensione del buffer rendendo il programma appendere. Se avete bisogno di reindirizzare e leggere l'errore di uscita o standar di serie la soluzione migliore è quella di leggere in modo asincrono. Un ottimo modo per fare questo è proposto da Mark Byers in questa discussione StackOverflow come l'ultima cosa si prega di notare che se il processo figlio esce solo perché si utilizza il processo. WaitForExit (Timeout) firma e va effettivamente in timeout si dovrebbe uccidere il processo di cmd. exe e la sua possibile children. WaitForExit () volte su quando cerco di catturare più linee Stdout WaitForExit () volte quando provo a catturare multi - linea Stdout ho scritto una breve funzione VB (vedi sotto) che cattura StandardOutput da un particolare programma di Windows (MyProgram. EXE). Il problema è questo: se MyProgram. EXE restituisce più di una singola riga di testo allora WaitForExit () sempre volte la funzione funziona bene se MyProgram. EXE restituire solo una riga di testo. Funziona bene anche con uscita multi-linea - restituendo una stringa con a capo incorporati - purché tolgo il test su WaitForExit (). Si noti che se eseguo MyProgram. EXE dalla riga di comando si ritorna rapidamente, indipendentemente dal numero di righe di testo che ho chiesto. La mia comprensione di WaitForExit () è che si restituisce True quando il processo che è in attesa su uscite, o False se il processo non è terminato dopo un numero specificato di millisecondi. Chiaramente devo avere frainteso qualcosa, ma non vedo nulla nella documentazione in linea di suggerire il motivo per cui sarebbe un problema se il l'uscita dal programma contiene una riga o molti. Qualcuno mi può dire quello che sto facendo male myFunction Funzione Pubblica (ByVal myOptions come stringa) come String Dim PsInfo come nuovo Diagnostics. ProcessStartInfo psInfo. FileName quotmyProgram. exequot psInfo. Arguments myOptions psInfo. CreateNoWindow Vero Falso psInfo. UseShellExecute psInfo. RedirectStandardOutput vero Dim newProc Come Diagnostics. Process Diagnostics. Process. Start (PsInfo) Dim myOutput come stringa quotquot Se newProc. WaitForExit (6000) Poi myOutput newProc. StandardOutput. ReadToEnd newProc. StandardOutput. Close () newProc. Close () newProc. Dispose () Return myOutput End Function - John Brock jbrockxxxxxx Re: WaitForExit () volte fuori quando cerco di catturare multi-linea Stdout On Mon, 7 aprile 2008 20:26:17 -0700, John Brock ltjbrockxxxxxxgt ha scritto: gt. gt Chiaramente devo aver frainteso qualcosa, ma non vedo nulla in GT alla documentazione in linea di suggerire perché sarebbe importa se gt del l'uscita dal programma contiene una riga o molti. Può gt qualcuno mi dica cosa sto facendo male è stata reindirizzata sullo standard output, ma non si è la lettura da quando si è bloccato sulla chiamata a WaitForExit (). Così, quando l'altro processo riempie il buffer di uscita relativamente piccolo per l'output standard, blocca. Cant procedere fino a leggere i dati dal standard output, liberando lo spazio di buffer in modo che possa emettere più uscita. Dal momento che si sta utilizzando ReadToEnd (), theres davvero alcun motivo per voi di chiamare WaitForExit (). Per definizione, il flusso di output standard solito terminare fino a quando il processo è terminato. Così si può chiamare ReadToEnd () in sé, e bloccherà fino a quando l'altro processo è terminato, così come WaitForExit () avrebbe avuto non è reindirizzato l'output. La documentazione non in effetti descrivono questo problema. Dalla pagina per ProcessStartInfo. RedirectStandardOutput: msdn2.microsoften-uslib. ardoutput. aspx Quando il processo figlio scrive dati sufficienti per riempire il suo flusso reindirizzato, è dipendente dal genitore. Il processo figlio attende la successiva operazione di scrittura fino al genitore legge dal flusso completo o chiude il flusso. La condizione risultati deadlock quando il processo chiamante e bambino attendere per l'altro per completare un'operazione, e non può continuare. Il tuo codice pretende molto molto situazione di stallo, perché youve incluso un timeout che sbloccare la situazione. Ma per il resto, questo è lo scenario esatto sei in esecuzione in.

No comments:

Post a Comment