Sunday 17 September 2017

Waitforexit C # Processo Di Avvio


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 le sue possibili children. Lets leggere ciò che dice di MSDN su di esso: The WaitForExit () () () di sovraccarico è usato per fare la corrente di attesa fino a quando filo il processo associato termina. Questo metodo indica al componente del processo di aspettare una quantità infinita di tempo per il processo per uscire. Ciò può causare un'applicazione per bloccarsi. Ad esempio, se si chiama CloseMainWindow per un processo che ha un interfaccia utente, la richiesta al sistema operativo per terminare il processo associato potrebbe non essere gestita se il processo viene scritto mai entrare nel suo ciclo di messaggi. Questo sovraccarico assicura che tutta l'elaborazione è stata completata, compresa la gestione di eventi asincroni per standard output reindirizzato. Si dovrebbe usare questo sovraccarico dopo una chiamata al sovraccarico WaitForExit (Int32) quando l'uscita standard è stato reindirizzato a gestori di eventi asincroni. Questo è, naturalmente, per. Cosa ti fa pensare che non aspetta il processo di nota per finire Quali sono i segni di che cosa è la prova Venerdì 20 Febbraio 2009 20:13 Non sono sicuro se questo è cambiato di recente, ma di nuovo nelle applicazioni al giorno sulla finestra mobili mai veramente chiusa quando si colpisce la X per chiudere loro, avrebbero solo ridurre al minimo e mantenere in esecuzione in background (questo non è stato un errore, è stata una caratteristica, dal momento che la prossima volta che si avvia l'applicazione sarebbe iniziato veramente veloce, yah lo so, folle ma vero), in modo che potrebbe essere il motivo per cui WaitForExit è forse comporta in modo strano e di attesa per l'avvio dell'applicazione, invece di uscire. ma poi di nuovo è solo speculazione sulla base di knowlegde delle antiche versioni di Windows Mobile. Venerdì 20 Febbraio 2009 23:03 Id piace urtare questa domanda in su. Im su Windows Mobile 6 Standard e Im cercando di generare una istanza del browser. Id piace aspettare fino a quando l'utente chiude il browser. Ma WaitForExit ritorna estremamente veloce. Ecco il codice: p nuovo Process () p. StartInfo. Arguments quotexample-sitequot p. StartInfo. Verb quotOpenquot p. StartInfo. UseShellExecute falso p. StartInfo. FileName quotIExplore. exequot p. Start) p. WaitForExit () MessageBox (.Show (quotNow il browser dovrebbe essere closedquot) Quale dovrebbe essere il modo giusto per ottenere i resuts attesi lunedì, giugno 08, 2009 22:45 Dove simbolo è. simbolo. AlexB Martedì 9 Giugno 2009 21:58 Im vedere lo stesso problema, ma su XP. Credo che la prova può essere visto in qualsiasi debugger (come sto vedendo), o in qualsiasi applicazione di console (non necessariamente sul cellulare) Mercoledì 2 Settembre 2009 20:35 Solo che tu non poi ottenere un oggetto processo che è possibile uso. Se si tenta myProc fioco come nuovo processo () myProc Process. Start (quotiexplorequot, simbolo quotfinance. yahooqhpsquot) myProc. WaitForExit () Riporta ancora immediatamente. Mercoledì 2 settembre 2009 20:48 Il problema è che non si sta iniziando una nuova istanza di iexplore. exe. Stai solo la creazione di una nuova finestra sul processo esistente. La mia ipotesi è inizia iexplore. exe, vede un'istanza precedente e comunica con l'istanza precedente in modo che si apre la nuova finestra, e quindi questo caso è iniziata immediatamente uscite. Così il comportamento è corretto e prevedibile. blog. voidnish Mercoledì 2 settembre 2009 20:52 Microsoft sta conducendo un sondaggio in linea per comprendere l'opinione del sito Web MSDN. Se si sceglie di partecipare, il sondaggio on-line sarà presentato a voi quando si lascia il sito Web MSDN. Ti piacerebbe partecipare

No comments:

Post a Comment