Wednesday 13 June 2018

Fluxo de processo waitforexit


Estou usando o código seguinte para escrever o PATH, EXECUTABLE NAME e ARGUMENTS para um arquivo em lotes e executá-lo através do CMD usando c. O problema às vezes o aplicativo é iniciado depois da execução do arquivo em lotes. E o código c doente me dá exceção ou qualquer notificação. Para o qual eu quero obter o Exitcode da CMD para determinar se os comandos foram executados corretamente. Como posso determinar o código de saída. Script dentro do Batchfile. Tenha em atenção que Notepads. exe é errado para obter o erro se ERRORLEVEL 1 sair B 1I verificou muitos fóruns para o comportamento inconsistente do método Process. WaitForExit (), mas não consegui identificar o problema real. Eu tenho o código abaixo Acima do código invoca BCP. exe para saída de dados no arquivo temporário. Este arquivo é então lido por dois segmentos (leitor e gravador) para escrever em outro arquivo após algum processamento sobre ele. O método processExited é o seguinte: O problema é que o quociente principal quotSOMETIMESquot não espera no método process. WaitForExit () e, eventualmente, o segmento principal dorme durante o tempo e, em seguida, o fluxo de execução se move para o chamador principal. O thread do leitor e o thread do Writer apenas terminam abruptamente e o arquivo não é processado completamente, portanto, o erro. A maioria (95) do tempo que este código funciona perfeitamente, mas observa-se que sempre que há carga no servidor, 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. Preciso saber por que existe esse comportamento inconsistente. O código é cumprido em 3.5 e o Framework sobre produção é 3.5 SP1. Como esse comportamento inconsistente pode ser resolvido Obrigado pela sua ajuda. Sexta-feira, 15 de julho de 2017 18:14 Isso não é necessariamente preciso. Considere o que aconteceria se WaitForExit funcionar corretamente. Em seguida, o método processExited é chamado, mas naquela primeira linha - antes da primeira linha ser impressa - o computador decide que seria um bom momento para mudar para o outro segmento. O segmento principal continua, até a linha Sleep. Uma vez que o segmento principal está a dormir, o método processCompleted continua. Tenha em mente que o computador pode arbitrariamente decidir mudar os tópicos em qualquer momento, sempre que quiser. Se você tiver vários segmentos em execução, você não pode garantir que qualquer método específico seja atingido antes de outro. Usar o Sleep não é uma maneira confiável de sincronizar threads, porque o sistema operacional pode saltar em qualquer altura, não apenas quando você decide dormir. Como uma nota lateral, neste caso você está combinando duas maneiras diferentes de verificar se o processo está para sair. Se você quiser realmente certificar-se de que o evento processCompleted é chamado antes que o segmento principal dorme, por que não fazê-los de forma síncrona assim: Substitua o evento processExit e simplesmente coloque tudo no DoOtherStuff (). Se seu código precisa ser executado de forma síncrona, a opção mais fácil é apenas torná-lo síncrono. Confira Meu Blog para notícias técnicas, dicas de desenvolvimento e outras informações para geeks como eu. Marcado como resposta por maverick1979 sexta-feira, 15 de julho de 2017 8:27 PM sexta-feira, 15 de julho de 2017 19:48 Como você sabe que o tópico não espera no WaitForExit () E o que você realmente quer dizer com isso - que processExited é Hit antes do arquivo bcpFileName é criado Qual é o comportamento que você está vendo É perfeitamente possível que isso só possa ser causado pelos fios que dormem em tempos inoportunos. Confira Meu Blog para notícias técnicas, dicas de desenvolvimento e outras informações para geeks como eu. Sexta-feira, 15 de julho de 2017 18:58 Pela mensagem de log (e hora na mensagem de log) que mostra que Thread. Sleep é chamado imediatamente. Redirecionando o erro padrão do processo BCP de: NAM para registrar o arquivo Durmecendo por 10 milissegundos Erro do processo BCP recebido (se algum): 0 Exit Status do processo BCP: 0 BCP concluído para: NAM O registro deve ser e é quando o código funciona bem (e eu Verificou este registro quando o código funcionar corretamente) Redirecionamento do erro padrão do processo BCP de: NAM ao arquivo de log Erro do processo BCP recebido (se algum): 0 Exit Estado do processo BCP: 0 BCP Concluído para: NAM Durmente por 10 milissegundos Editado por Maverick1979 sexta-feira, 15 de julho de 2017 7:44 PM Formatação Isso não é necessariamente preciso. Considere o que aconteceria se WaitForExit funcionar corretamente. Em seguida, o método processExited é chamado, mas naquela primeira linha - antes da primeira linha ser impressa - o computador decide que seria um bom momento para mudar para o outro segmento. O segmento principal continua, até a linha Sleep. Uma vez que o thread principal está a dormir, o método processCompleted continua. Tenha em mente que o computador pode arbitrariamente decidir mudar os tópicos em qualquer momento, sempre que quiser. Se você tiver vários segmentos em execução, você não pode garantir que qualquer método específico seja atingido antes de outro. Usar o Sleep não é uma maneira confiável de sincronizar threads, porque o sistema operacional pode saltar em qualquer altura, não apenas quando você decide dormir. Como uma nota lateral, neste caso você está combinando duas maneiras diferentes de verificar se o processo está para sair. Se você quiser realmente certificar-se de que o evento processCompleted é chamado antes que o segmento principal dorme, por que não fazê-los de forma síncrona assim: Substitua o evento processExit e simplesmente coloque tudo no DoOtherStuff (). Se seu código precisa ser executado de forma síncrona, a opção mais fácil é apenas torná-lo síncrono. Confira Meu Blog para notícias técnicas, dicas de desenvolvimento e outras informações para geeks como eu. Marcado como resposta por maverick1979 sexta-feira, 15 de julho de 2017 8:27 PM sexta-feira, 15 de julho de 2017 19:48

No comments:

Post a Comment