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 condizoni di gara sto vedendo gli errori strani durante l'esecuzione di una riga di comando all'interno di un servizio di Windows usando il processo. Il seguente frammento di codice è simile al codice in questione: static RunCommandLine vuoto (stringa di comando) processo di processo nullo pubblica provare ProcessStartInfo ProcessInfo nuova ProcessStartInfo (quotcmd. exequot, il comando quotC quot) processInfo. CreateNoWindow vero processInfo. WindowStyle ProcessWindowStyle. Hidden processInfo. UseShellExecute falso processInfo. RedirectStandardOutput vero processInfo. LoadUserProfile vero processo nuovo processo () process. StartInfo ProcessInfo Process. Start () process. EnableRaisingEvents vero process. OutputDataReceived nuova DataReceivedEventHandler (processOutputDataReceived) catch (Exception ex) static void processOutputDataReceived (object sender, DataReceivedEventArgs e) il codice funziona benissimo quando implementato utilizzando una finestra di console ma non riesce quando in un servizio di Windows. Di seguito si può escludere, come cose che ho già tentato: esegue il servizio come un account con maggiori privilegi l'impostazione del servizio Permettono di interagire con i percorsi completi di alimentazione del desktop ho tracciato il problema torna a RedirectStandardOutput, quando qualsiasi approccio per reindirizzare lo standard output è implementato (ho anche provato process. StandardOutput. ReadToEnd () e generando un thread separato, ecc) il comando (o meglio eseguibile che viene chiamato) non riesce. Ha quasi certamente a che fare con l'ambiente di servizio finestra (o la sua mancanza), come l'esecuzione del comando prime in un cmd opere finestra, e quanto sopra in una finestra di console funziona anche La domanda è: che cosa esattamente devo fare per replicare la console ambiente ho letto attraverso vari forum e la sua sembrano puntare verso utilizzando alcuni tutti i seguenti codice non gestito: LogonUserEx () ImpersonateLoggedOnUser () CreateEnvironmentBlock () GetUserProfileDirectory () LoadUserProfile () CreateProcessAsUser () DestroyEnvironmentBlock () UnloadUserProfile () RevertToSelf () può chiunque confermare che questo sia corretto Qualsiasi aiuto molto apprezzato. Im in esecuzione su XP Server2003. Il fallimento è un errore oscura specifico per l'eseguibile di essere chiamato, quindi non c'è nessun eccezioni gettati e il processo () esiste come previsto, ma il process. ExitCode indica un guasto. perché im catturando l'stdout via OutputDataRecieved vedo l'errore esatto. Quello che non posso ottenere passato è che il codice che chiama il exe funziona perfettamente bene quando viene chiamato dalla console. Chiaramente qualunque sia l'exe sta tentando di fare, neanche doesnt dispone di autorizzazioni sufficienti per farlo. o la mancanza di ambiente Sabato 6 dicembre, 2008 02:27 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
Post a Comment