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 settembre 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 novembre 14 a 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 razza Assembly condition. System. Diagnostics. ProcessStartInfoClass: System. dll Namespace: System. Diagnostics Sommario specifica un insieme di valori utilizzati quando si inizia un processo. C Sintassi: public class sigillato ProcessStartInfo Osservazioni ProcessStartInfo viene utilizzato in combinazione con il componente del processo. Quando si avvia un processo utilizzando la classe Process, si ha accesso a elaborare le informazioni in aggiunta a quella disponibile quando si collega a un processo in esecuzione. È possibile utilizzare la classe ProcessStartInfo per un maggiore controllo sul processo di iniziare. È necessario almeno impostare la proprietà ProcessStartInfo. FileName, manualmente o utilizzando il costruttore. Il nome del file è qualsiasi applicazione o documento. Qui un documento è definito come qualsiasi tipo di file che ha un'azione aperta o di default associato con esso. È possibile visualizzare tipi di file registrati e le loro applicazioni associate per il computer utilizzando la finestra di dialogo Opzioni cartella disponibili attraverso il sistema operativo. Il pulsante Avanzate porta a una finestra di dialogo che mostra se c'è un'azione aperto associato a uno specifico tipo di file registrati. Inoltre, è possibile impostare le altre proprietà che definiscono le azioni da portare con quel file. È possibile specificare un valore specifico per il tipo di proprietà ProcessStartInfo. FileName per il System. Diagnostics. ProcessStartInfo. Verb (non supportato sulla sorgente condiviso CLI) immobili. Ad esempio, è possibile specificare di stampa per un tipo di documento. Inoltre, è possibile specificare i valori delle proprietà ProcessStartInfo. Arguments di essere argomenti della riga di comando per passare al file di procedura aperta. Ad esempio, se si specifica un editor di testo nella proprietà ProcessStartInfo. FileName, è possibile utilizzare la proprietà ProcessStartInfo. Arguments per specificare un file di testo da aprire per l'editor. Standard input è di solito la tastiera e lo standard output e l'errore sono di solito lo schermo del monitor. Tuttavia, è possibile utilizzare il ProcessStartInfo. RedirectStandardInput. ProcessStartInfo. RedirectStandardOutput e le proprietà ProcessStartInfo. RedirectStandardError a causare il processo per ottenere input da o tornare output in un file o altro dispositivo. Se si utilizza il Process. StandardInput. Process. StandardOutput. o in Process. StandardError sulla componente Process, è necessario impostare il valore corrispondente sulla proprietà ProcessStartInfo. In caso contrario, il sistema genera un'eccezione quando si legge o si scrive al flusso. Impostare ProcessStartInfo. UseShellExecute per specificare se avviare il processo utilizzando la shell del sistema operativo. È possibile modificare il valore di qualsiasi proprietà ProcessStartInfo fino al momento che il processo inizia. Dopo aver avviato il processo, la modifica di questi valori non ha alcun effetto. System. Diagnostics. ProcessStartInfo Elenco dei membri: il costruttore di default. Questo costruttore viene chiamato da costruttori della classe derivate per inizializzare stato in questo tipo. Inizializza una nuova istanza della classe ProcessStartInfo senza specificare un nome di file con il quale avviare il processo. Overload:.ctor (string filename) Inizializza una nuova istanza della classe ProcessStartInfo e specifica un nome di file, ad esempio un'applicazione o un documento con il quale avviare il processo. Overload:.ctor (string filename, argomenti stringa) di inizializzare una nuova istanza della classe ProcessStartInfo e specifica un nome di file di applicazione con cui avviare il processo, così come una serie di argomenti della riga di comando per passare all'applicazione. Gest o imposta l'insieme di argomenti della riga di comando da utilizzare quando si avvia l'applicazione. Ottiene percorsi di ricerca per i file, le directory per i file temporanei, le opzioni specifiche per l'applicazione, e altre informazioni simili. System. Diagnostics. ProcessStartInfo Gli Dettagli overload ctor 1 Sintesi di inizializzare una nuova istanza della classe ProcessStartInfo senza specificare un nome di file con il quale avviare il processo. costruttore di default. Questo costruttore viene chiamato da costruttori della classe derivate per inizializzare stato in questo tipo. C Sintassi: Note È necessario impostare almeno la proprietà ProcessStartInfo. FileName prima di iniziare il processo. Il nome del file è qualsiasi applicazione o documento. In questo caso, documento è definito come qualsiasi tipo di file che ha un'azione aperta o di default associato con esso. È possibile visualizzare tipi di file registrati e le loro applicazioni associate per il computer utilizzando la finestra di dialogo Opzioni cartella disponibili attraverso il sistema operativo. Il pulsante Avanzate porta a una finestra di dialogo che mostra se c'è un'azione aperto associato a uno specifico tipo di file registrati. In alternativa, è anche possibile impostare altre proprietà prima di iniziare il processo. Il System. Diagnostics. ProcessStartInfo. Verb (non supportato sulla CLI fonte comune) azioni forniture di proprietà di prendere, come la stampa, con il file indicato nella proprietà ProcessStartInfo. FileName. La proprietà ProcessStartInfo. Arguments fornisce un modo per passare argomenti della riga di comando al file quando il sistema apre. Overload ctor 2 Sintesi di inizializzare una nuova istanza della classe ProcessStartInfo e specifica un nome di file, ad esempio un'applicazione o un documento con il quale per avviare il processo. C Sintassi: un'applicazione o un documento con cui avviare un processo. Osservazioni Il nome del file è qualsiasi applicazione o documento. In questo caso, documento è definito come qualsiasi tipo di file che ha un'azione aperta o di default associato con esso. È possibile visualizzare tipi di file registrati e le loro applicazioni associate per il computer utilizzando la finestra di dialogo Opzioni cartella disponibili attraverso il sistema operativo. Il pulsante Avanzate porta a una finestra di dialogo che mostra se c'è un'azione aperto associato a uno specifico tipo di file registrati. È possibile modificare la proprietà ProcessStartInfo. FileName dopo aver chiamato questo costruttore, fino al momento che il processo inizia. Dopo aver avviato il processo, la modifica di questi valori non ha alcun effetto. Overload ctor 3 Sintesi di inizializzare una nuova istanza della classe ProcessStartInfo e specifica un nome di file di applicazione con cui avviare il processo, così come una serie di argomenti della riga di comando per passare all'applicazione. C Sintassi: un'applicazione con cui avviare un processo. argomenti della riga di comando per passare all'applicazione all'avvio del processo. Osservazioni Il nome del file è qualsiasi applicazione o documento. In questo caso, documento è definito come qualsiasi tipo di file che ha un'azione aperta o di default associato con esso. È possibile visualizzare tipi di file registrati e le loro applicazioni associate per il computer utilizzando la finestra di dialogo Opzioni cartella disponibili attraverso il sistema operativo. Il pulsante Avanzate porta a una finestra di dialogo che mostra se c'è un'azione aperto associato a uno specifico tipo di file registrati. È possibile modificare il ProcessStartInfo. FileName o ProcessStartInfo. Arguments proprietà dopo aver chiamato questo costruttore, fino al momento che il processo inizia. Dopo aver avviato il processo, la modifica di questi valori non ha alcun effetto. Di proprietà: argomenti (lettura-scrittura) Sintesi Gest o imposta l'insieme di argomenti della riga di comando da utilizzare quando si avvia l'applicazione. C Sintassi: di proprietà: EnvironmentVariables (sola lettura) Sintesi Ottiene percorsi di ricerca per i file, le directory per i file temporanei, le opzioni specifiche per l'applicazione, e altre informazioni simili. C Sintassi: Proprietà: RedirectStandardError (lettura-scrittura) Sintesi Ottiene o imposta un valore che indica se l'output di errore processs viene scritto nel istanze di processo Process. StandardError membro, che vi permetterà di scrivere ad una destinazione diversa da quella flusso di errore standard (di solito il schermo). Usato per scrivere i dati di errore in un file o un registro, per esempio. C Sintassi: Annotazioni Il componente Process comunica con un processo figlio tramite un tubo. Se un processo figlio scrive dati sufficienti al tubo per riempire il buffer, il bambino si bloccherà finché il genitore legge i dati dal tubo. Ciò può causare deadlock se l'applicazione sta leggendo tutto l'output sullo standard error e standard output, ad esempio, utilizzando il seguente codice C. In questo caso, sia il genitore e dei processi bambino sarebbe stato bloccato, come il tubo pieno impedisce il processo figlio di completare, mentre il processo padre è in attesa a tempo indeterminato per il processo figlio per uscire. Questo problema può essere risolto spostando il ReadToEnd () prima della WaitForExit (). Come segue. Un problema analogo si pone se si reindirizza sia lo standard output e standard error e quindi tenta di leggere sia, ad esempio, utilizzando il seguente codice C. In questo caso, se il processo figlio scrive testo standard error bloccherà il processo, perché il processo genitore non può leggere da errore standard fino al termine lettura standard output. Tuttavia, il processo padre non leggere da standard output fino a quando termina il processo. Una soluzione consigliata a questa situazione è quello di creare due thread in modo che l'applicazione in grado di leggere l'output di ogni flusso su un thread separato. Proprietà: RedirectStandardInput (lettura-scrittura) Sintesi Ottiene o imposta un valore che indica se l'ingresso di comando di processo viene letta dal istanze di processo Process. StandardInput membro, consentendo di leggere da una fonte diversa il flusso di input standard (di solito la tastiera). Utilizzato per leggere dati da un file, per esempio. C Sintassi: Proprietà: RedirectStandardOutput (lettura-scrittura) Sintesi Ottiene o imposta un valore che indica se l'uscita di processo viene scritto nel istanze di processo Process. StandardOutput membro, che vi permetterà di scrivere ad una destinazione diversa da quella flusso di output standard (di solito il monitor schermo). Usato per scrivere i dati in un file, per esempio. C Sintassi: Annotazioni Il componente Process comunica con un processo figlio tramite un tubo. Se un processo figlio scrive dati sufficienti al tubo per riempire il buffer, il bambino si bloccherà finché il genitore legge i dati dal tubo. Ciò può causare deadlock se l'applicazione sta leggendo tutto l'output sullo standard error e standard output, ad esempio, utilizzando il seguente codice C. In questo caso, sia il genitore e dei processi bambino sarebbe stato bloccato, come il tubo pieno impedisce il processo figlio di completare, mentre il processo padre è in attesa a tempo indeterminato per il processo figlio per uscire. Questo problema può essere risolto spostando il ReadToEnd () prima della WaitForExit (). Come segue. Un problema analogo si pone se si reindirizza sia lo standard output e standard error e quindi tenta di leggere sia, ad esempio, utilizzando il seguente codice C. In questo caso, se il processo figlio scrive testo standard error bloccherà il processo, perché il processo genitore non può leggere da errore standard fino al termine lettura standard output. Tuttavia, il processo padre non leggere da standard output fino a quando termina il processo. Una soluzione consigliata a questa situazione è quello di creare due thread in modo che l'applicazione in grado di leggere l'output di ogni flusso su un thread separato. Proprietà: UseShellExecute (lettura-scrittura) Sintesi Ottiene o imposta un valore che indica se utilizzare la shell del sistema operativo per avviare il processo. C Sintassi: Note L'impostazione di questa proprietà su false consente di reindirizzare i flussi di ingresso, di uscita, e di errore. Quando si utilizza la shell del sistema operativo per avviare i processi, si è in grado di avviare qualsiasi documento (che è un qualsiasi tipo di file registrati associato ad un eseguibile che ha un'azione di apertura predefinito) ed eseguire operazioni sui file, come la stampa, con il Processo componente. Quando ProcessStartInfo. UseShellExecute è falsa. si è in grado di avviare solo gli eseguibili con il componente del processo. Proprietà: WorkingDirectory (lettura-scrittura) Sintesi di ottenere o impostare la directory iniziale per il processo da avviare. C Sintassi: Note Se la directory è già parte della variabile di percorso di sistema, non è necessario ripetere la posizione directorys in questa proprietà.
Comments
Post a Comment