Monday 27 November 2017

C # Process Redirectstandardoutput Waitforexit


Sua solução não precisa de AutoResetEvent, mas você pesquisa. Quando você faz pesquisa em vez de usar o evento (quando eles estão disponíveis), então você está usando CPU sem razão e que indicam que você é um programador ruim. Sua solução é realmente ruim quando comparado com o outro usando AutoResetEvent. (Mas eu não te dei -1 porque você tentou ajudar). Ndash Eric Ouellet Nov 7 14 at 18:38 Eu estava tendo o mesmo problema, mas a razão era diferente. No entanto, aconteceria no Windows 8, mas não no Windows 7. A seguinte linha parece ter causado o problema. A solução era NÃO desativar UseShellExecute. Eu agora recebi uma janela popup Shell, que é indesejável, mas muito melhor do que o programa esperando nada particular acontecer. Então eu adicionei o seguinte work-around para que: Agora, a única coisa que me incomoda é por que isso está acontecendo no Windows 8 em primeiro lugar. Respondeu Jan 13 15 at 10:35 Exemplo de uso ImplementaçãoEstou vendo falhas estranhas ao executar uma linha de comando dentro de um serviço do Windows usando Process. O snippet de código a seguir é semelhante ao código em questão: public static void RunCommandLine (comando string) Process process null try ProcessStartInfo processInfo novo ProcessStartInfo (quotcmd. exequot, quot / C comando quot) processInfo. CreateNoWindow true processInfo. WindowStyle ProcessWindowStyle. Hidden processInfo. UseShellExecute processInfo. RedirectStandardOutput true processInfo. LoadUserProfile processo verdadeiro Process () process. StartInfo processInfo process. Start () process. EnableRaisingEvents true process. OutputDataReceived novo DataReceivedEventHandler (processOutputDataReceived) catch (exceção ex) static void processOutputDataReceived (object sender, DataReceivedEventArgs E) O código funciona bem quando implementado usando uma janela de console, mas falha quando em um serviço do Windows. O seguinte pode ser descartado como as coisas que eu já tentei: executando o serviço como uma conta com privilégios maiores definindo o serviço Permitir interagir com os caminhos cheios de suprimentos de desktop Eu tenho rastreado o problema de volta para RedirectStandardOutput, quando qualquer abordagem para redirecionar saída padrão é Implementado (eu também tentei process. StandardOutput. ReadToEnd () e spawning um segmento separado etc) o comando (ou melhor executável que está sendo chamado) falha. É quase certo que tem a ver com o ambiente de serviço de janela (ou falta dela) como executar o comando raw em uma janela de cmd funciona, eo acima em uma janela de console também funciona A questão é o que exatamente eu preciso fazer para replicar o console Eu li através de vários fóruns e seu parece apontar para usar alguns / todos os seguintes código não gerenciado: LogonUserEx () ImpersonateLoggedOnUser () CreateEnvironmentBlock () GetUserProfileDirectory () LoadUserProfile () CreateProcessAsUser () DestroyEnvironmentBlock () UnloadUserProfile () RevertToSelf () Alguém pode confirmar isso para ser correto Qualquer ajuda muito apreciada. Estou executando no XP / Server2003. A falha é um erro obscuro específico para o executável sendo chamado, portanto, não há exceções. net sendo lançadas eo Process () existe como esperado, no entanto, o processo. ExitCode indica uma falha. Porque im capturar o stdout via OutputDataRecieved eu vejo o erro exato. O que eu não consigo passar é que o código que chama o exe funciona perfeitamente bem quando chamado a partir do console. Claramente qualquer que seja o exe está tentando fazer, ou não tem permissão suficiente para fazer. Ou falta de ambiente sábado, 06 de dezembro de 2008 2:27 Microsoft está conduzindo uma pesquisa on-line para entender a sua opinião sobre o site Msdn. Se você optar por participar, o questionário on-line será apresentado a você quando você deixar o site Msdn. Gostaria de participar? Tenho uma situação onde eu quero executar um arquivo e, em seguida, excluir o arquivo executável quando a execução é feita. Eu uso System. Diagnostics. Process. Start () para executar o arquivo, e usar. WaitForExit () para aguardar o processo para concluir. Em seguida, uso File. Delete (filename) para excluir o arquivo executável. O problema é que, às vezes, File. Delete irá falhar com o seguinte erro: Isso me leva a acreditar que, de alguma forma, o processo ainda está vivo e bloquear o arquivo executável mesmo após a chamada. WaitForExit () retorna. Eu encontrei outros threads na rede que descrevem o mesmo comportamento, mas eu não encontrei qualquer que concluir com uma razoável explicação ou solução para o problema, além de sugestões de colocar um Sleep (n) após WaitForExit (). Exemplos: Aqui está um programa de exemplo que reproduz o problema para mim. Eu testei no Windows XP e no Windows 7, e ambos eventualmente falham em algum ponto com o mesmo erro. Observe também que o executável ss. exe é um simples aplicativo de console quotHello Worldquot simples. E a saída normalmente parece algo como (com quantidade variável de iterações antes do acidente ocorre): Qualquer idéia sobre por que isso acontece, e se houver alguma correção para isso (além de colocar dorme no código) Sexta-feira, 08 de janeiro de 2010 3 : 40 PM A razão é que, embora o processo seja concluído, pode demorar alguns milissegundos para o sistema operacional terminar de destruí-lo. É um sistema operacional multi-tarefa, afinal, está tentando atender a todos ao mesmo tempo. Infelizmente, não há maneira de saber quando o arquivo não está mais bloqueado (presicely). Quando você WaitForExit, você está criando um objeto de bloqueio no objeto de processo. O objeto de processo não pode ser destruído até que o bloqueio é liberado e você não pode esperar em algo que não existe (tipo de frango e ovo de questão). Então, a única coisa razoável que você pode fazer é continuar tentando, algo como: Marcado como resposta por Samuel Stanojevic Sexta-feira, 08 de janeiro de 2010 16:20 Editado por Tergiver sexta-feira, 08 de janeiro de 2010 16:20 mudou para bool, loop infinito Correcção Sexta-feira, 08 de Janeiro de 2010 16:15 Microsoft está a realizar uma pesquisa online para compreender a sua opinião sobre o site Msdn. Se você optar por participar, o questionário on-line será apresentado a você quando você deixar o site Msdn. Você gostaria de participar

No comments:

Post a Comment