Sunday 15 October 2017

Mono Process Waitforexit Trava


Então eu tenho um programa Im perto de ser completo com. Basicamente, o que eu planejo fazer com ele está usando o agendador de tarefas do Windows para chamá-lo em determinados horários no horário da manhã para converter automaticamente, usando a ferramenta CLI da HandBrake, alguns arquivos que meu colega de trabalho descarrega na pasta de origem. Estou tentando obter o meu programa para converter apenas um programa de cada vez no loop foreach, mas se eu usar process. WaitForExit (), o programa trava indefinidamente após o primeiro arquivo estar localizado e convertido. Sempre que eu depurar o meu programa, estou recebendo 2 cmd de pop ups por qualquer motivo. Um é o prompt cmd real que está executando o comando encontrado no comando string e o outro é um caminho para minha pasta debugbin em Meus documentos. Depois que o primeiro arquivo é convertido, a janela de comando real que executa o comando e a conversão Fecham, mas então eu tenho uma janela popup por trás, mantendo-se aberto dizendo que se eu remover processo. WaitForExit (), meu programa começará a converter todos os arquivos Na pasta de origem, que está bem, mas é menos do que ideal. Aqui está o meu código. Quero que o programa apenas converta um arquivo de cada vez e saia automaticamente da instância atual de seu processo antes de mudar para a próxima partida. Obrigado por todas as sugestões e sugestões. Perguntou 8 de agosto 13 em 15: 04O 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.

No comments:

Post a Comment