Processo de criação


Eu tenho o seguinte código: Eu sei que a saída do processo que estou começando é de cerca de 7MB de comprimento. Executá-lo no console do Windows funciona bem. Infelizmente, programaticamente isso trava indefinidamente em WaitForExit. Observe também este não código pendurar para saídas menores (como 3KB). Se for o caso, o que devo fazer em vez disso? Se não, o que estou fazendo errado? O problema é que se você redirecionar StandardOutput e / ou StandardError, o buffer interno pode ficar cheio. Qualquer ordem que você usar, pode haver um problema: Se você esperar para o processo de sair antes de ler StandardOutput o processo pode bloquear tentando escrever para ele, para que o processo nunca termina. Se você ler de StandardOutput usando ReadToEnd, em seguida, seu processo pode bloquear se o processo nunca fecha StandardOutput (por exemplo, se ele nunca termina, ou se ele está bloqueado escrevendo para StandardError). A solução é usar leituras assíncronas para garantir que o buffer não fique cheio. Para evitar qualquer deadlocks e coletar todas as saídas de StandardOutput e StandardError você pode fazer isso: EDIT: Consulte as respostas abaixo para lidar com o tempo limite e evitar exceções ObjectDisposeException. A documentação para Process. StandardOutput diz para ler antes de esperar, caso contrário, você pode deadlock, snippet copiado abaixo: Mark Byers resposta é excelente, mas gostaria apenas de acrescentar o seguinte: o OutputDataReceived e ErrorDataReceived delegados precisam ser removidos antes do outputWaitHandle e errorWaitHandle get Disposto. Se o processo continuar a produzir dados após o tempo limite ter sido excedido e então terminar, as variáveis ​​outputWaitHandle e errorWaitHandle serão acessadas após serem descartadas. (FYI eu tive que adicionar esta advertência como uma resposta como eu não poderia comentar em seu borne.) Nós temos esta edição também (ou uma variante). Tente o seguinte: 1) Adicione um tempo limite para p. WaitForExit (nnnn) onde nnnn está em milissegundos. 2) Coloque a chamada ReadToEnd antes da chamada WaitForExit. Isto é o que nós vimos MS recomendar. 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çãoEu olhei em diferentes threads sobre isso, mas todos eles usam o Process. RedirectStandardOutput True, que eu não. Estou tentando abrir um processo (aplicativo de console, não feito por mim) para torná-lo compilar um arquivo. acs especial para um arquivo. o. A estrutura é simples, o único argumento é o arquivo que você deseja compilar. Mas em determinados arquivos meu aplicativo trava ao tentar abrir o processo. Aqui está o meu código: Para iniciar o processo eu uso praticamente o mesmo código que outro cara fez em C. E seu código está funcionando perfeitamente. Espero que o seu dia tenha sido melhor do que ontem, mas que é pior do que amanhã. Por favor, marque como resposta se eu resolver o seu problema. ) Editado por Visual Vincent sábado, 3 de janeiro de 2017 14:57 Você comparou os FileNames e Argumentos de aqueles que trabalham e aqueles que não Há alguma diferença neles, como os que trabalham, não contêm espaços em branco no FileName Ou argumentos e os que trabalham não contêm espaços em branco neles Se você achar que para ser o problema, então você precisa adicionar Cotações para o início eo fim do FileName ou Argumentos. Meu primeiro palpite é que o Argumentos precisa das citações assim porque, vejo espaços em branco no seu exemplo dos Argumentos. Se você diz que não pode ser feito, em seguida, vou experimentá-lo Editado por IronRazerz sábado, 03 de janeiro de 2017 3:51 Marcado como resposta por Visual Vincent sábado, 03 de janeiro de 2017 4:33 PM Saturday, January 03, 2017 3:41 PM Todas as respostas Você comparou os FileNames e Argumentos de aqueles que funcionam e aqueles que não Há alguma diferença neles, como aqueles que trabalham, não contêm espaços em branco no FileName ou argumentos e os que funcionam não contêm espaços em branco neles Se você achar que para ser o problema, então você precisa adicionar Cotações para o início eo fim do FileName ou Argumentos. Meu primeiro palpite é que o Argumentos precisa das citações assim porque, vejo espaços em branco no seu exemplo dos Argumentos. Se você diz que não pode ser feito, em seguida, vou experimentá-lo Editado por IronRazerz sábado, 03 de janeiro de 2017 3:51 Marcado como resposta por Visual Vincent sábado, 03 de janeiro de 2017 4:33 PM Saturday, January 03, 2017 3:41 PM Você já tentou o mesmo comando manualmente em uma janela de console Talvez ele pára e espera por algo. Ou não defina CreateNoWindow. ErrorDialog e WIndowStyle e ver o que acontece. Você comparou os FileNames e Argumentos de aqueles que trabalham e aqueles que não há alguma diferença neles, como os que Trabalho não contêm espaços em branco no FileName ou argumentos e os que não funcionam contêm espaços em branco neles Se você achar que para ser o problema, então você precisa adicionar Cotações para o início eo fim do FileName ou Argumentos. Meu primeiro palpite é que o Argumentos precisa das citações assim porque, vejo espaços em branco no seu exemplo dos Argumentos. Ps. Argumentos Chr (34) amp SavePath amp Chr (34) Se você diz que não pode ser feito, em seguida, mal experimentá-lo Isso realmente fez isso. Eu tinha esquecido que espaços em branco faz com que seja um novo argumento, bobo. Eu não uso argumentos de processo que muitas vezes. ) Espero que o seu dia tenha sido melhor do que ontem, mas que é pior do que amanhã. Por favor, marque como resposta se eu resolver o seu problema. ) Editado por Visual Vincent Sábado, 03 de Janeiro de 2017 16:33

Comments