Processo Waitforexit Non Funziona


NET 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 le implementazioni del processo StdOutStdError ReadLine intorno alle mie esigenze specifiche, vado in quanto ho deciso che issue. Im scrivere un programma che inizia un numero imprecisato di processi in sequenza usando myProcess. Start () e myProcess. WaitForExit (). Il problema sembra essere che alcuni processi potrebbero iniziare altri processi e quindi uscire, causando il mio programma di continuare senza il processo avviato in realtà completato il suo compito. C'è un modo per monitorare questi quotsub-processesquot Grazie in anticipo Edit: Dopo un po 'ulteriori test ho scoperto che lo stesso problema si verifica quando ad esempio a partire Winword. exe. WaitForExit semplicemente non funziona con alcune applicazioni. Tom ha scritto circa lo stesso problema in questa discussione, ma era soddisfatto quando funzionava su un altro computer. Sembra che un quotWINWORD. EXEquot-processo è già in esecuzione sulla mia macchina. Forse perché io uso Word come editor di posta elettronica (). La chiusura di questa prima di eseguire il mio programma (che è configurato per avviare Word e attendere che per uscire) quotsolvesquot il problema. Tuttavia, non posso presumo che winword isnt esecuzione quando il mio programma. Giovedi, mese di agosto 09, 2007 08:01 No, non ce n'è molto si può fare in modo affidabile. Il problema è, per il momento si chiama WaitForExit l'applicazione potrebbe essere già iniziato un'altra applicazione e c'è usciti modo di dire se l'applicazione ha generato tutti gli altri in quel punto. La sua natura di Process. Start. youre non trovando che attende WaitForExit a tempo indeterminato, perché il processo è venuto e andato prima chiamata che sei Giovedi, mese di agosto 09, 2007 13:15 Beh, lo fa creare un nuovo processo, il suo solo così in fretta che non può presentarsi in Process Esploratore. Tutto Process. Start fa è chiedere il processo per avviare Theres niente di più che il nuovo processo è tenuto a fare. Se nessuna intenzione di restare nella memoria, questo è la sua scelta. Theres niente che tu possa fare, purtroppo. Alcune applicazioni iniziano sempre un nuovo processo. Quando si apre un file di SLN di Visual Studio, per esempio, si inizia sempre due processi. Theres una piccola applicazione che controlla il tipo di file SLN e quindi apre una versione appropriata di Visual Studio, perché è possibile associare una sola domanda per l'estensione. L'altro problema è che alcune applicazioni in grado di gestire più documenti alla volta, il che significa che in genere il riutilizzo processi esistenti. In casi come questo, se il processo viene riutilizzato perché un documento è stato già aperto, allora questo significa che il documento è stato aperto con Process. Start può essere chiuso, ma l'hosting processo è ancora in esecuzione (manutenzione del documento originale) il che significa che non si può mai dire quando il processo che è stato riutilizzato quando hai chiamato Process. Start è fatto con il documento che è stato aperto con il Process. Start. Se siete alla ricerca di integrare una sorta di soluzione WinWord, vorrei suggerire utilizzando l'automazione. Vedere msdn. microsoftnewsgroupsdefault. aspxdgmicrosoft. public. officedevamplangenampcrUS per le discussioni su automatizzando i prodotti Office. Giovedi, mese di agosto 09, 2007 13:37 Si dovrà tenere traccia di quanti processi sono stati avviati e utilizzare questo nella logica. Si potrebbe anche usare i WaitForMultipleObjects se si sa in anticipo approxinately quanti processi sarà avviato. Che avvio di un processo, il processo blocca un oggetto e incrementa il contatore. Ogni volta che il processo termina non si blocca l'oggetto e decrementa il contatore. Quando il processo è stato innescato quantità x di volte è stato detto di aspettare si sveglia, si blocca l'oggetto e controlli per vedere come manyobjets ci sono e che attende che il numero di oggetti di nuovo. Giovedi, mese di agosto 09, 2007 12:39 No, ce n'è non molto si può fare in modo affidabile. Il problema è, per il momento si chiama WaitForExit l'applicazione potrebbe essere già iniziato un'altra applicazione e c'è usciti modo di dire se l'applicazione ha generato tutti gli altri in quel punto. La sua natura di Process. Start. Youre non trovando che attende WaitForExit a tempo indeterminato, perché il processo è venuto e andato prima chiamata che sei Giovedi, mese di agosto 09, 2007 01:15 No, spero che situazione solito si verificano (E 'anche possibile Havent pensato prima.) . Comunque, che risponde chiaramente uno dei problemi. Grazie. Ma ci dovrebbe essere un sollution al problema relativo winword. exe partenza (e simili) che. Nessun processo in più è mostrato nella taskmanager (ma ancora parola si presenta). Voglio imporre la creazione di un nuovo processo che posso controllare. Giovedi, mese di agosto 09, 2007 13:25 Beh, non creare un nuovo processo, il suo solo così in fretta che non può mostrare fino in Process Explorer. Tutto Process. Start fa è chiedere il processo per avviare Theres niente di più che il nuovo processo è tenuto a fare. Se nessuna intenzione di restare nella memoria, questo è la sua scelta. Theres niente che tu possa fare, purtroppo. Alcune applicazioni iniziano sempre un nuovo processo. Quando si apre un file di SLN di Visual Studio, per esempio, si inizia sempre due processi. Theres una piccola applicazione che controlla il tipo di file SLN e quindi apre una versione appropriata di Visual Studio, perché è possibile associare una sola domanda per l'estensione. L'altro problema è che alcune applicazioni in grado di gestire più documenti alla volta, il che significa che in genere il riutilizzo processi esistenti. In casi come questo, se il processo viene riutilizzato perché un documento è stato già aperto, allora questo significa che il documento è stato aperto con Process. Start può essere chiuso, ma l'hosting processo è ancora in esecuzione (manutenzione del documento originale) il che significa che non si può mai dire quando il processo che è stato riutilizzato quando hai chiamato Process. Start è fatto con il documento che è stato aperto con il Process. Start. Se siete alla ricerca di integrare una sorta di soluzione WinWord, vorrei suggerire utilizzando l'automazione. Vedere msdn. microsoftnewsgroupsdefault. aspxdgmicrosoft. public. officedevamplangenampcrUS per le discussioni su automatizzando i prodotti Office. Giovedi, mese di agosto 09, 2007 13:37 Beh, è ​​vero che l'inquadramento doesnt consentono di trovare direttamente i processi secondari, qualcosa può essere cobled insieme. È possibile ottenere il PID del processo è stato avviato, quindi utilizzando PInvoke si può scoprire il genitore Pid di tutti i processi in esecuzione e confrontarli. Si potrebbe quindi attendere per quei preocesses sub per uscire Ecco un esempio di C utilizzando l'API. youll voler guardare in qualcosa di simile Pinvoke per come convertirli Giovedi, mese di agosto 09, 2007 16:20 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

Comments