Thursday 28 December 2017

Fluxo do processo waitforexit


Usando Process. BeginOutputReadLine pode levar a linhas stdout perdidas 12219 Ao escrever código que cria processos filho e precisa capturar stdout, descobri que as linhas de saída faltam a seguinte condição: lotes de paralelismo. ProcessStartInfo. RedirectStandardOutput true Process. OutputDataReceived CollectLines (ou seja, usando o fluxo async) Process. BeginOutputReadLine () Process. WaitForExit (int. MaxValue) Observe que passando -1 (timespen infinito) para WaitForExit não faz com que as linhas desapareçam (com base em Meu próprio teste). Criei um pequeno aplicativo de demonstração para fazer isso. Ele repros em netcoreapp1.0 e net45. Processredirect. zip. Basta usar dotnet executar para experimentá-lo. Dito isto, você pode capturar stdout usando Process. StandardOutput (que é um StreamReader). No entanto, para consumir isso assincronamente e com segurança você precisa usar tópicos de fundo / tarefas. Em outras palavras: método de captura stdout usando tempo limite infinito eu acho que isso é um problema porque é muito fácil entrar nesta armadilha. Usando os eventos para capturar saída é muito conveniente, uma vez que você não tem que se preocupar em fazer tópicos de fundo ou tarefas. Além disso, a Internet recomenda este método: Eu só tentei isso no Windows. NET Framework 4.5 e. NET Core (netcoreapp1.0). Além disso, todas essas informações estão relacionadas a stdout, mas imagino stderr tem o mesmo problema. Minha informação de dotnet é: Ive atualizou o aplicativo de teste para suportar sistemas não-Windows (usando o echo): processredirect2.zip. Os resultados são os mesmos para Windows, Linux e Mac OS X. joelverhagen. Para melhor ou pior, o que você está vendo é design documentado. Essa sobrecarga garante que todo o processamento foi concluído, incluindo o tratamento de eventos assíncronos para a saída padrão redirecionada. Você deve usar essa sobrecarga após uma chamada para a sobrecarga WaitForExit (Int32) quando a saída padrão foi redirecionada para manipuladores de eventos assíncronos. Quando a saída padrão foi redirecionada para manipuladores de eventos assíncronos, é possível que o processamento de saída não tenha concluído quando esse método retorna. Para garantir que o processamento de eventos assíncrono foi concluído, chamar a sobrecarga WaitForExit () que não recebe nenhum parâmetro após receber um verdadeiro desta sobrecarga. Você pode ver aqui que o código explicitamente não espera a saída redirecionada para concluir se foi passado um tempo limite não-infinito: Dito isto, eu não sei por que ele foi projetado desta forma. Joelverhagen Usando WaitForExit sem tempo limite após a outra sobrecarga deve desbloqueá-lo, como apontado nos documentos. Fechando esta edição, por favor reabra se a assistência adicional needed. Process waitforexit timeout Processo waitforexit timeout Locksmith Bellflower BEMVINDO 24 HR LOCKSMITH LA Locksmith residencial, serralheiro comercial, serralheiro do carro, cofres, serviços de serralheiro de emergência Somos uma empresa familiar e operada desde 2000 que tem Criou uma grande reputação superando todos os padrões de excelência. Nossa empresa confiável pode fornecer a mais alta qualidade, serviço de serralheiro rápido e amigável a preços que você pode pagar. NEED A LOCKSMITH SERRALHEIRO DE 24 HORAS LOS ANGELES É A SUA MELHOR SOLUÇÃO interior, frente e verso Re-chave para portas Bloqueios instalados / reparados, Re-chave sistemas de bloqueio principal Peepholes e deadbolts instalado Reparo de bloqueio danificado Correio de bloqueio de janelas, - keys Fechaduras decorativas Temos mais de 13 anos de experiência combinada serralheiro, oferecemos uma enorme gama de serviços de serralheiro residencial. Somos uma empresa que fornece serviços de chaveiro acessível e de alta qualidade. Estamos contentes e orgulhosos de prestar serviços em Los Angeles. AUTO CAR LOCKSMITH LICENCIADO BONDED INSUERED Oferecemos 24-7 serviço de serralheiro profissional Auto. Nossos serralheiros auto estão prontos para ajudá-lo a qualquer hora, em qualquer lugar. Carros, 18 Wheelers, mais recente faz modelos, Motocicletas apenas nomeá-lo. Nossos serralheiros auto são especialistas estrangeiros e domésticos. Ao contrário de nossos concorrentes locksmith não cobramos extra para noites ou fins de semana serviço de serralheiro. Todos os nossos serralheiros são experientes em todos os aspectos da tecnologia de serralheiro e equipamentos para fornecer o serviço de serralheiro rápido e profissional 24 horas por dia. Fastest Responce Time / Contato Info Serviços Tags Serviços de serralheiro Eu verifiquei muitos fóruns de comportamento inconsistente do método Process. WaitForExit (), mas eu couldnot identificar o problema real. Eu tenho o código a seguir acima de código invoca BCP. exe para dados de saída no arquivo temporário. Este arquivo é então lido por dois threads (leitor e escritor) para gravar em outro arquivo após algum processamento nele. O método processExited é o seguinte: O problema é que o thread principal quotSOMETIMESquot não espera no método process. WaitForExit () e eventualmente o thread principal dorme durante o tempo e, em seguida, o fluxo de execução se move para o chamador principal. O segmento Reader e Writer Thread acaba abruptamente e o arquivo não é processado completamente, portanto, o erro. A maioria (95) do tempo este código funciona perfeitamente, mas é observado que sempre que há carga no servidor, então encontramos esse comportamento inconsistente e, portanto, o erro. Estou certo de que o processo BCP é executado completamente, pois verificamos o arquivo criado pelo BCP que está completo. Eu preciso saber por que existe este comportamento inconsistente O código é cumprido em. Net3.5 eo Framework sobre a produção é. Net3.5 SP1. Como esse comportamento inconsistente pode ser resolvido Obrigado pela sua ajuda. Sexta-feira, julho 15, 2017 6:14 PM Isso não é necessariamente preciso. Considere o que aconteceria se WaitForExit funcionar corretamente. Em seguida, o método processExited é chamado, mas na primeira linha - antes da primeira linha é impresso - o computador decide que seria um bom momento para alternar para o outro segmento. A linha principal continua, até a linha Sleep. Uma vez que o thread principal está dormindo, o método processCompleted continua. Tenha em mente que o computador pode arbitrariamente decidir trocar os threads em qualquer ponto no tempo, sempre que quiser. Se você tem vários segmentos em execução, você não pode garantir que qualquer método em particular será atingido antes do outro. Usar Sleep não é uma maneira confiável de sincronizar threads, porque o sistema operacional pode saltar em qualquer momento, não apenas quando você decide dormir. Como uma nota lateral, neste caso, você está combinando duas maneiras diferentes de verificar o processo para sair. Se você realmente deseja certificar-se de que o evento processCompleted é chamado antes da thread principal dormir, por que não fazê-los de forma síncrona como este: Substitua o evento processExited e basta colocar tudo em DoOtherStuff (). Se seu código precisa ser executado de forma síncrona, a opção mais fácil é apenas torná-la síncrona. Confira Meu Blog para notícias de tecnologia, dicas de desenvolvimento e outras informações para geeks como eu. Marcado como resposta por Maverick1979 sexta-feira, 15 de julho de 2017 20:27 sexta-feira, 15 de julho de 2017 19:48 Como você sabe que o segmento não espera em WaitForExit () E o que você realmente quer dizer com isso - que processExited é Hit antes de o arquivo bcpFileName é criado O que é o comportamento youre vendo Seu perfeitamente possível que isso poderia ser causado apenas pelos threads dormir em tempos inopportune. Confira Meu Blog para notícias de tecnologia, dicas de desenvolvimento e outras informações para geeks como eu. Sexta-feira, 15 de julho de 2017 18:58 É porque a mensagem de log (e tempo na mensagem de log) que mostra que Thread. Sleep é chamado imediatamente. Redirecionamento BCP erro padrão do processo de: NAM para arquivo de log Dormir por 10 milissegundos Erro de BCP Processo recebido (se houver): 0 Estado de saída do processo BCP: 0 BCP Concluído para: NAM Logging deve ser e é quando o código funciona bem (e eu (NAM para arquivo de log) Erro de BCP Processo recebido (se houver): 0 Estado de Saída do Processo BCP: 0 BCP Concluído para: NAM Dormir por 10 milissegundos Editado por Maverick1979 sexta-feira, 15 de julho de 2017 19:44 Formatação Isso não é necessariamente preciso. Considere o que aconteceria se WaitForExit funcionar corretamente. Em seguida, o método processExited é chamado, mas na primeira linha - antes da primeira linha é impresso - o computador decide que seria um bom momento para alternar para o outro segmento. A linha principal continua, até a linha Sleep. Uma vez que o thread principal está dormindo, o método processCompleted continua. Tenha em mente que o computador pode arbitrariamente decidir trocar os threads em qualquer ponto no tempo, sempre que quiser. Se você tem vários segmentos em execução, você não pode garantir que qualquer método em particular será atingido antes do outro. Usar Sleep não é uma maneira confiável de sincronizar threads, porque o sistema operacional pode saltar em qualquer momento, não apenas quando você decide dormir. Como uma nota lateral, neste caso, você está combinando duas maneiras diferentes de verificar o processo para sair. Se você realmente deseja certificar-se de que o evento processCompleted é chamado antes da thread principal dormir, por que não fazê-los de forma síncrona como este: Substitua o evento processExited e basta colocar tudo em DoOtherStuff (). Se seu código precisa ser executado de forma síncrona, a opção mais fácil é apenas torná-la síncrona. Confira Meu Blog para notícias de tecnologia, dicas de desenvolvimento e outras informações para geeks como eu. Marcado como resposta por maverick1979 sexta-feira, 15 de julho de 2017 20:27 sexta-feira, 15 de julho de 2017 19:48

No comments:

Post a Comment