Saturday 24 November 2018

Aguarde espetáculos


O código parece quase que este: Como você pode ver, o código inicia um processo cmd. exe e passa para ele o comando que eu quero ser executado. Eu redireccionar StandardError e StandarOutput para lê-los a partir do código. O código lê-los antes do processo. WaitForExit (Timeout) chamar conforme recomendado pela Microsoft (mais sobre isso mais tarde). O problema surge se o comando que eu enviar para cmd. exe nunca termina ou trava indefinidamente. No código eu usei o comando ping - t 8.8.8.8 que, por causa da opção - t, pings o host sem parar. O que acontece O processo cmd. exe junto com o comando ping - t nunca sai e nunca fecha o fluxo stdout e assim o nosso código trava na linha Output. StandardOutput. ReadToEnd () porque não consegue ler todos os fluxos. O mesmo acontece também se um comando em um arquivo em lotes trava por qualquer motivo e, portanto, o código acima poderia trabalhar continuamente por anos e, em seguida, pendurar de repente sem qualquer razão aparente. Antes de eu escrever que seu recomendado para ler fluxos redirecionados antes do processo. WaitForExit (Timeout) chamada, bem isso é especialmente verdadeiro se você usar a assinatura WaitForExit sem o tempo limite. Se você chamar o processo. WaitForExit () antes de ler os fluxos redirecionados: código 2: você pode enfrentar um deadlock se o comando que você anexar ao cmd. exe ou o processo que você está chamando preenche a saída padrão ou erro padrão. Isso porque o nosso código não pode alcançar o processo de saída de linhas. StandardOutput. ReadToEnd () Como uma questão de fato o processo filho (o comando ping ou um arquivo em lotes ou qualquer processo que você está executando) não pode ir se o nosso programa não lê os buffers cheios dos fluxos e isso não pode acontecer porque o código está pendurado em A linha com o processo. WaitForExit () que irá esperar para sempre para o projecto filho para sair. O tamanho padrão de ambos os streams é 4096 bytes. Você pode testar esses dois tamanhos com esses arquivos em lote: O primeiro script grava 4096 bytes na saída padrão e o segundo no erro padrão. Salve um desses em C: testbuffsize. bat e execute o nosso processo de chamada de programa. WaitForExit () antes do processo de saída. StandardOutput. ReadToEnd () como no código 2. Você pode fazê-lo escrevendo CommandResult Resultado ExecuteShellCommandSync (c: testbuffsize. bat, 1000) na linha 13 do código 1. O código não vai cair, mas se você escrever mais um byte em qualquer um dos dois fluxos ele vai transbordar o tamanho do buffer fazendo o programa aguentar. Se você precisa redirecionar e ler a saída padrão ou erro standar a melhor solução é lê-los de forma assíncrona. Uma excelente maneira de fazer isso é proposta por Mark Byers neste thread stackoverflow Como a última coisa, observe que se o processo filho sai apenas porque você usa o processo. WaitForExit (Timeout) assinatura e ele realmente vai em timeout você deve matar o processo cmd. exe e suas possíveis crianças. Sua solução não precisa 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

No comments:

Post a Comment