Friday 24 November 2017

Processo espera beforexit c # timeout


O código parece quase isso: como você pode ver, o código inicia um processo cmd. exe e passa para ele o comando que 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. Se eu iniciar outro aplicativo CF usando o seguinte código no NetCF2.0, o aplicativo nunca sai, apenas parece pendurar Dim p Como novo processo Dim info como novo ProcessStartInfo (quotSync. exequot. Quot1quot) Se eu executar o aplicativo manualmente ou passar por ele, ele sai como esperado. É quase como o WaitForExit é mantê-lo vivo ou algo em terça-feira 26 de setembro de 2006 2:21 PM Se você tiver uma reprodução confiável que não está usando componentes de terceiros, envie um relatório de erro aqui. Esta fila é usada para o IPC para enviar mensagens básicas do Sync. exe para o aplicativo principal. Essas mensagens são linhas básicas, geralmente um caractere de caracteres para completo, citação de quotuquot de erro para uma atualização de software disponível etc. Eu crio a fila imediatamente antes de chamar o aplicativo Sync. exe e algo assim parece manter o Sync. exe vivo, quando Eu encerrei o aplicativo principal Sync. exe fecha também. Esta implementação funciona bem em um dispositivo CE 4.2, mas não no dispositivo WM5 que eu tenho aqui. Qualquer idéia de como eu poderia modificar o código do WM5, ou eu deveria considerar usar o MSMQ ou algo parecido. Quarta-feira, 27 de setembro de 2006 4:02 PM Ok, só no caso de alguém estar lendo isso. A história até agora. Eu mudei o código da fila de mensagens para usar o OpenNetCF. WindowsCE. Messaging. P2PMessageQueue e eu ainda tenho o mesmo problema. O problema ocorre quando o aplicativo de chamada abre uma Fila nomeada e, em seguida, inicia o segundo aplicativo como um processo e chama WaitForExit. O segundo aplicativo, em seguida, abre a mesma fila nomeada e envia mensagens que são recebidas pelo aplicativo de chamada. No entanto, quando o segundo aplicativo terminar, ele nunca fecha, causando WaitForExit para bloquear o aplicativo de chamada. Se eu parar o aplicativo de chamada, as duas aplicações serão fechadas. Isso ocorre apenas se eu usar a mesma fila nomeada em ambos os aplicativos. É como se estivessem ligados entre eles. Tudo funcionou bem em PPC2003 e CE4.2, mas no WM5.0 está causando uma dor de cabeça real. Ajuda sexta-feira, 29 de setembro de 2006 8:29 AM Se você possui uma reprodação confiável que não é Usando qualquer componente de terceiros, envie um relatório de erro aqui. Quarta-feira, 11 de outubro de 2006 7:55 PM Tenho o mesmo problema ao iniciar tablediff. exe (usando a opção - c) que faz parte da instalação do SQL 2005. Terça-feira, 17 de outubro de 2006 10:54 PM Você pode especificar um parâmetro quottimeoutquot. Aqui está uma função estática C que faz exatamente isso. Ele usa cmd. exe para iniciar processos. Public static int ExecuteCommand (comando de cadeia, int Timeout) ProcessInfo novo ProcessStartInfo (quotcmd. exequot. QuotC quot Command) Process Process. Start (ProcessInfo) Sábado, 14 de junho de 2008 2:23 PM A Microsoft está realizando uma pesquisa on-line para entender sua opinião Do site Msdn. Se você optar por participar, a pesquisa on-line será apresentada quando você deixar o site Msdn. Gostaria de participar Ajude-nos a melhorar o MSDN. Visite a nossa página UserVoice para enviar e votar ideias Centros Dev Recursos de aprendizagem

No comments:

Post a Comment