Processstartinfo Waitforexit Trava


No Console Application, Windows 10, Visual Studio 2015. NET 4.6 eu ligo método único no Main chamado TestProcess. Modo de compilação Debug, se eu executar o aplicativo sem depurar, imprime o texto correto: pressione qualquer tecla para continuar. Se eu executar o aplicativo com a depuração, aguarda 3 segundos antes de imprimir Erro Falso Falso Falso Isso é apenas uma simplificação do problema real, esse código é uma espinha dorsal de algum código complexo que também trava na versão sem depuração para md5sums. exe, mas funciona para algum outro Programas. O código Coplex também trava em var a proc. WaitForExit (tempo limite) até o tempo limite como no exemplo anexado. Por outro lado, esta simplificação funcionará na versão sem depurador. Além disso, todos esses problemas começaram com o Windows 10, no Windows 7, tudo funcionou bem. EDIT Não pode entender porque md5sums. exe causaria problemas e se eu usar algo mais, ou seja. FileName ping, Argumentos localhost tudo funciona como esperado. EDIT2 Meu programa complexo parou de funcionar no Windows 10 (Release - Run without debugging), mas este exemplo trava no Windows 7 também (Debug - Run with debugging) perguntou 17 de maio 16 às 13:21 Este problema tem uma solução muito simples. Você só pode descobrir quando você escreve uma mensagem de erro significativa, que dá ao usuário de seu programa uma boa dica sobre o que exatamente deu errado. Uma boa regra geral nunca é usar um tempo limite inferior a 10 segundos em um PC de estação de trabalho, 20 segundos em um servidor. Adicione mais se é um programa quotcomplexquot. Ndash Hans Passant 17 de maio 16 às 14:01 O programa Complexo HansPassant tem tempo limite nos dias :) Com 20 segundos de tempo, o comportamento de alteração do didn39t para este exemplo, embora test. txt seja arquivo com apenas uma linha curta de texto e Console. WriteLine (quotError: 39 39, 39 39quot) retornou quotError: 3939, 3939. a, b e c são todos falsos quando falha. O que seria uma mensagem de erro significativa seria ndash watbywbarif 17 de maio 16 às 14:29 Houve 3 capturas para resolver isso: md5sums. exe em alguns casos interrompe a execução depois de terminar quando iniciado com minhas configurações: Pressione ENTER para sair Isso pode ser observado se CreateNoWindow for Configurado para false e stdout, o redirecionamento stderr foi removido. Isso pode ser corrigido usando a opção - e: saia imediatamente, não faça uma pausa antes de retornar. Isso solucionará todos os casos. Mas como eu não usei, eu tinha comportamento inconsistente, dependendo do depurador e da versão do Windows. Quando executado sem a pausa de depuração não foi disparado, embora todas as configurações fossem as mesmas e pressione ENTER para sair não estava em saída. Mas correr com a depuração causou uma pausa para bloquear o programa até o tempo limite, onde os md5sums pendurariam no gerenciador de tarefas aguardando Enter. No modo de lançamento, execute sem depuração, embora a pausa seja disparada e pressione ENTER para sair estava em saída no Windows 7 md5sums retornados e a execução continuou sem bloquear e pressionar o tempo limite. Este não foi o caso no Windows 10, onde md5sums viveria na tarefa, aguardando Enter e o programa continuasse após o término do tempo limite. Respondeu 18 de maio 16 em 11: 16O código parece quase isso: como você pode ver, o código inicia um processo cmd. exe e passa para ele o comando que eu quero ser executado. Eu redireciono StandardError e StandarOutput para lê-los a partir do código. O código lê-los antes do processo. WaitForExit (Timeout) chamada conforme recomendado pela Microsoft (mais sobre isso mais tarde). O problema surge se o comando que eu envio 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 juntamente com o comando ping - t nunca sai e nunca fecha o fluxo de stdout e, portanto, o nosso código trava na linha Output. StandardOutput. ReadToEnd () do processo de saída porque não conseguiu ler todo o fluxo. O mesmo acontece também se um comando em um arquivo em lotes trava por qualquer motivo e, portanto, o código acima pode funcionar continuamente durante anos e, em seguida, é suspenso repentinamente sem nenhum motivo aparente. Antes de escrever, recomendava ler fluxos redirecionados antes do processo. WaitForExit (Timeout), bem, isso é especialmente verdadeiro se você usar a assinatura WaitForExit sem o tempo limite. Se você chamar processo. WaitForExit () antes de ler os fluxos redirecionados: código 2: você pode enfrentar um impasse se o comando que você anexar ao cmd. exe ou o processo que você está chamando preencher a saída padrão ou erro padrão. Isso porque nosso código não pode atingir as linhas de processo de saída. StandardOutput. ReadToEnd () De fato, o processo filho (o comando ping ou um arquivo em lote ou o processo que estiver executando) não pode continuar se o nosso programa não lê os buffers preenchidos dos fluxos e isso não pode acontecer porque o código está pendurado em A linha com o processo. WaitForExit () que aguardará para sempre que o projeto filho saia. O tamanho padrão de ambos os fluxos é de 4096 bytes. Você pode testar esses dois tamanhos com esses arquivos em lote: o primeiro script escreve 4096 bytes para a saída padrão e o segundo para erro padrão. Salve um destes em C: testbuffsize. bat e execute o processo de chamada do nosso 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 irá pendurar, mas se você escrever um byte mais em qualquer um dos dois fluxos, ele irá transbordar o tamanho do buffer tornando o programa aguentar. Se você precisa redirecionar e ler a saída padrão ou o erro padrão, a melhor solução é lê-los de forma assíncrona. Uma excelente maneira de fazer isso é proposta por Mark Byers neste segmento stackoverflow. Como a última coisa, observe que, se o processo filho sair apenas porque você usa o processo. WaitForExit (Timeout) assinatura e ele realmente vai no tempo limite, você deve matar o processo cmd. exe e seus possíveis filhos.

Comments

Popular posts from this blog

Trade Binário Opções Australiano

Xprofuter Forex Indicador Revisão

Seminário Gratuito De Negociação Forex Filipinas