Saturday 7 April 2018

Waitforexit timeout


Tempo limite Waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
ProcessStartInfo WaitForExit Timeout.
Preciso imprimir um arquivo pdf com ProcessStartInfo.
O nome do arquivo e os argumentos são corretos eles funcionam quando colados em cmd. O código funciona corretamente, mas após Process. Start quando se trata de WaitForExit, o programa não termina. Recebo o erro de tempo limite:
System. Threading. ThreadAbortException: Thread estava sendo abortado. no System. Threading. WaitHandle. WaitOneNative (SafeHandle waitableSafeHandle, UInt32 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext) no System. Threading. WaitHandle. InternalWaitOne (SafeHandle waitableSafeHandle, Int64 milissegundosTimeout, Boolean hasThreadAffinity, Boolean exitContext) no System. Diagnostics. Process. WaitForExit (Int32 milissegundos).
Eu procurei e tentei algumas coisas como configurar & lt; httpRuntime executionTimeout = "300" / & gt; e execute um 500 ou como no código com process. WaitForExit (6000); e mais alto, onde nenhum exeption, mas nada foi impresso.
Existe um erro ou estou faltando alguma coisa?
EDIT: Eu mudei meu bloco de código acima. Agora, o código funciona no modo de depuração, mas ainda não imprimirá meu documento quando publicado. Eu também tentei usar um Usuário diferente. No modo de depuração, o código imprime o documento, mas é executado na consulta kill.
O ProcessStartInfo. Verbs retorna uma Exceção de argumento, mas eu não sei por quê.
Depois de muita tentativa, teste e pesquisa, tenho certeza que meu código funciona. Então eu ainda não sei por que meu código parou de funcionar. Mas a mudança do Adobe Reader 9.0 no servidor para 7.0 agora funciona.
Quando eu estava depurando localmente com o Adobe Reader 9.0 também funcionava, então eu acho que talvez houvesse uma atualização no servidor web. Eu não testei isso ainda.

Tempo limite Waitforexit
Eu tenho uma ferramenta que pode levar bastante tempo para executar, mais do que o tempo limite padrão do Powershell para o processo inicial de 600 segundos. Você pode matar o thread executando WaitForExit () ou usar a sobrecarga que permite especificar um timeout bool WaitForExit (int msToWait). Se você executá-lo em um segmento separado e matá-lo, você receberá uma exceção interrompida. Você pode querer certificar-se do C # VB IT Por exemplo: # Empregos simplesProcessos Iniciados: Não Logo job1Process Inicia: Não Logo job2Process Inicia: Não Logo job31 Processo Paradas: Não Logo job13 2 Process Stops: No Logo job3Process Stops: No Logo job2 WaitForExit ; p. Qualquer pessoa pode ajudar a adicionar o limite de tempo limite a este processo. Este tutorial C # usa Processo para iniciar EXEs externos. Espaço para nome e Processo de diagnóstico. No entanto, se o limite de tempo limite for atingido, você pode precisar de outra chamada de WaitForExit para garantir que ela tenha terminado depois de ter. Aguarde até que o processo saia ou limite o tempo limite. A razão é, WaitForExit () irá bloquear o segmento que o chama, e neste caso, é o segmento GUI principal do seu winform. Isso significa, entre outras coisas, que nem sequer redesenha seu winform enquanto a bomba de mensagens da GUI está bloqueada. Na verdade, você deve lidar com isso de duas maneiras: 1. Mova a criação do processo e aguarde outro. Fecha o std:: dentro e espera que o processo saia, retorna falso se o processo não sair no tempo atribuído Sintaxe Tag: Visual C # Geral não sair do Visual C #; 14 Processo interrompido antes do período de tempo limite.
Vídeo relacionado "Waitforexit Timeout C #" (404 filmes):
c # - Tempo limite decorrido? por WaitForExit.
Galeria de Imagens "Waitforexit Timeout C #" (526 fotos):
Tempo limite de função em.
Se o processo for encerrado antes do tempo decorrido, o WaitForExit retornará. Como você especificou um tempo limite finito, você permite a possibilidade de a função retornar antes do processo ter terminado. Então, você poderia escrever seu código como este: se retornar p. ExitCode; Caso contrário, devolva NotFinishedExitCode. Então, em vez de pedir o processo para preencher o buffer e aguarde-me para esvaziá-lo para que a chamada. Xamarin Platform C # no iOS, Android, Mac Windows; Xamarin Test Cloud System. Diagnóstico; Processo; WaitForExit; (Timeout. Formulário NET que inicia um método assíncrono que acompanha uma lista de arquivos executáveis ​​e os inicia. No clique do botão, eu chamo meu método async. Process Development Class C # C Sharp. Home; C # C Sharp; 2D Graphics; using System Como evitar os deadlocks ao ler o console filho redirecionado em C # 2. WaitForExit (); var on Como evitar deadlocks ao ler o filho redirecionado. Olá, eu tenho um programa que executa o bloco de notas como este: ProcessStartInfo myP new ProcessStartInfo (); myP. Como aguardar um aplicativo descascado para finalizar usando o Visual Basic 2005 ou Para um Microsoft Visual C #. Olá, eu tenho um aplicativo Windows Forms que tem botões para clicar para executar outros programas. Um dos aplicativos que ele deve executar é um ClickOnce Windows Formulários Obrigado, Alistair. Você pode matar o thread executando WaitForExit () ou usar a sobrecarga que permite que você especifique um timeout bool WaitForExit (int msToWait). Se você executá-lo em um segmento separado e matá-lo, você vai conseguir uma excepção interrompida em. Você pode querer certificar-se do Timeout PingReply em C #. Por algum motivo, 60 do tempo em que o pings expirou, mesmo que eu possa fazer ping no PC. Tag: Visual C # General não sair do Visual C #; 2. Processo interrompido antes do período de tempo limite. Home ProcessStartInfo pendurado no WaitForExit? Bonjour, Bon ben j'ai cherch dans o fórum, mais je n'ai pas trouv mon bonheur. Mon problme c'est que je n'arrive pas use la fonction WaitForExit () de. Descreve como aguardar o encerramento de um aplicativo descascado usando o Visual C #. ForExit async, no entanto, eu quero usar a sobrecarga do parâmetro Int32 como em Como eu altero este método de extensão para que ele funcione com o tempo limite para Se esta solução pode ser melhorada, deixe seus comentários, mas acho que é bastante padrão usando c # bibliotecas para Não posso dar errado com isso. Para este fim, eu uso o WaitForExit methos com um tempo limite. Então, para testar isso, adicionei um ciclo infinito ao outro programa, de modo que nunca volte. Meu problema é que o WaitForExit não faz. Mesmo WaitForExit (1) nunca retorna quando o outro programa trava. E o que devo fazer para que funcione? Quero aguardar um processo para finalizar, como eu altero esse método de extensão para que ele funcione com o par de tempo limite. Use WaitForExit (timeout) em vez de ativar a propriedade HasExited para alguns testes # 3906 c # saída de leitura, mas com um tempo limite Se você deseja iniciar outro processo e aguardar (com tempo limite) para concluir, você pode usar o seguinte (do MSDN). Out5000; Obter caminho para a pasta do sistema. Eu sou novo no processo de assíncrono do estilo thread e comecei a fazê-lo. ProcessStartInfo pendurado em WaitForExit? ProcessStartInfo pendurado em WaitForExit? NET Dica: Execute comandos do C #. ExitCode O código, em seguida, inicia o processo e aguarda que ele murche completo ou expirar. WaitForExit retorna um booleano:. Ao postar sua resposta, você concorda com a política de privacidade e os termos de vb. Isso nos permitirá construir uma versão assíncrona simples do WaitForExit. A tarefa de tempo limite só será concluída se o tempo limite expirar antes do processo realmente sair. Fecha o std:: e espera que o processo saia, retorna falso se o processo não sair no tempo dado Sintaxe classe c # simples para Reconhecimento Óptico de Caracteres (OCR) usando tesseract use: pass. Aguarde um processo para sair: ProcessStartInfo Development C # CSharp Tutorial.
PM 5: 21: 47 AM Discutir e fazer perguntas sobre o C. Uma abordagem alternativa é chamar WaitForExit e fornecer um tempo limite. NET Framework Algorithms and Data Structures Audio C. NÃO faça seu formulário esconder ou minimizar, a menos que você diga seu código para fazer isso antes de chamar WaitForExit () Tempo limite da Função em Processo Estou desenvolvendo um aplicativo de consola C # que inicia uma linha de comando e obtém. WaitForExit (Int32) faz o thread atual aguardar até o processo associado terminar. Ele deve ser chamado após todos os outros métodos serem chamados no processo. Define o período de tempo para aguardar o processo associado para sair e bloqueia o segmento de execução atual até o tempo decorrido ou o processo foi encerrado. WaitForExit (Timeout) assinatura e ele realmente vai no tempo limite, você deve matar o cmd. Como eu sei se o prazo expirou ou o processo foi encerrado pelo usuário? WaitForExit retorna falso se o processo ainda estiver sendo executado após o tempo limite; use isso para determinar se deve matá-lo. Tim Robinson Ago 19 '10 às 10: 08 Você pode matar o thread executando WaitForExit () ou usar a sobrecarga que permite especificar um timeout bool WaitForExit (int msToWait). Se você executá-lo em um segmento separado e matá-lo, você receberá uma exceção interrompida. Você pode querer certificar-se de que o processo que você iniciou ainda não está sendo executado (se for, mate-o).

Code Ducky.
um blog para codificadores por codificadores.
Trabalhando com processos em.
Os idiomas de scripts e shell são geralmente construídos em torno da capacidade de um processo para iniciar facilmente e trabalhar com os resultados dos outros. Este é o principal modo de processamento em bash, enquanto o ruby ​​suporta pelo menos 5 abordagens integradas com diferentes níveis de flexibilidade e concisão.
Em, isso é uma espécie de operação normalmente é feito através da API System. Diagnostics. Process. O Process API é bastante geral e poderoso, mas pode ser complicado e difícil de usar corretamente nos casos de uso comum que são tratados tão bem pelas linguagens acima. Como um spoiler, acabei envolvendo grande parte dessa complexidade em uma nova biblioteca: MedallionShell. Com o MedallionShell, esse tipo de tarefa é um one-liner:
Mais sobre isso mais tarde, no entanto. Por enquanto, vamos voltar ao Processo. Como um exemplo concreto, recentemente queria que meu aplicativo lancasse uma instância do NodeJS para executar o compilador menos css. Eu precisava escrever na entrada padrão do Node & # 8217; ao capturar o texto de saída padrão, texto de erro padrão e código de saída.
Uma tentativa inicial.
Aqui é o código com que comecei:
Este código é bastante detalhado; infelizmente também é bastante buggy.
Lidando com os argumentos do processo.
Um dos primeiros problemas que notamos com este código é que a propriedade Arguments no ProcessStartInfo é apenas uma string. Se os argumentos que estamos passando são dinâmicos, precisaremos fornecer a lógica de escape adequada antes de concatenar para impedir que coisas como espaços em caminhos de arquivos sejam quebrados. Escapar os argumentos da linha de comando do Windows é estranhamente complexo; Felizmente, o código necessário para implementá-lo está bem documentado nesta publicação do StackOverflow. Assim, a primeira mudança que nós vamos fazer é adicionar lógica de escape:
Lidar com deadlocks.
Um problema menos óbvio é o bloqueio. Os três fluxos de processo (entrada, saída e erro) são finitos em quanto de conteúdo eles podem armazenar. Se o buffer interno for preenchido, então quem estiver escrevendo para o fluxo irá bloquear. Neste código, por exemplo, não lemos os fluxos de saída e erro até que o processo tenha saído. Isso significa que podemos encontrar-nos em um caso em que o Node esgota o buffer de erro. Nesse caso, o Nó bloquearia a gravação em erro padrão, enquanto nosso aplicativo está bloqueado a leitura até o final do padrão. Assim, nós nos encontramos em um impasse!
O Process API fornece um método que parece projetado para lidar com isso: BeginOutput / ErrorReadLine. Com este método, você pode assinar o assíncrono & # 8220; DataReceived & # 8221; eventos em vez de ler os fluxos de saída diretamente. Dessa forma, você pode ouvir ambos os fluxos ao mesmo tempo. Infelizmente, este método não fornece nenhuma maneira de saber quando o último bit de dados foi recebido. Porque tudo é assíncrono, é possível (e eu observei isso) para que os eventos disparem depois que WaitForExit () retornou.
Felizmente, podemos fornecer nossa própria solução alternativa usando Tarefas para ler asíncronamente as transmissões enquanto aguardamos o Nó para sair:
Adicionando um tempo limite.
Outra questão que gostaria de lidar é a de um processo pendurado. Em vez de esperar para que o processo saia, nosso código seria mais robusto se forçássemos um timeout em vez disso:
Async todo o caminho!
Enquanto nós agora estamos usando o IO assíncrono para ler dos fluxos do processo, ainda estamos bloqueando um segmento enquanto aguardamos o processo para concluir. Podemos melhorar a eficiência aqui, indo totalmente assíncrono:
Adaptando-se a volumes de dados maiores.
Outra questão que pode surgir ao tentar generalizar essa abordagem é a do volume de dados. Se estivermos fornecendo uma grande quantidade de dados através do processo, nós provavelmente queremos substituir as chamadas convenientes ReadToEndAsync () com loops de leitura assíncronos que processam cada pedaço de dados conforme ele vem.
Mudando para MedallionShell.
Nós já construímos um código (esperançosamente) correto, robusto e eficiente para trabalhar com um processo. No entanto, espero que este exemplo o tenha convencido de que a API do Processo não é suficiente para o trabalho quando se trata de facilidade de uso. Para esse fim, irei apresentar uma alternativa: a biblioteca MedallionShell (disponível no NuGet). Aqui, a lógica equivalente usando MedallionShell:
Com o MedallionShell, os argumentos são escapados automaticamente, os fluxos de processo são automaticamente armazenados em buffer para evitar o impasse, e tudo está bem envolvido em uma API baseada em tarefas compatível com asínc. Nós não teremos que nos preocupar em chamar Dispose (): por padrão, o Processo é descartado automaticamente após a conclusão do comando.
O MedallionShell também oferece sobrecargas do operador para permitir o redirecionamento semelhante à da entrada padrão e saída padrão. Isso significa que você pode usar & # 8220; & lt; & # 8221; e & # 8220;> & # 8221; para canalizar dados de e para fluxos, arquivos e coleções. Você pode até usar o & # 8220; | & # 8221; para canalizar dados de um objeto Command para outro.
Mike Adelson.
Últimas publicações de Mike Adelson (ver todos)
Implementando Equals () e GetHashCode () em C # 7 - 3 de junho de 2017 Scripting in C # - 3 de maio de 2017 7 maneiras de usar C # 7 throw expressions - 26 de abril de 2017.
Sobre Mike Adelson.
I & # 8217; m engenheiro de software em Applied Predictive Technologies em Washington D. C., onde trabalho em & # 8220; dados grandes & # 8221; análise e desenvolvimento web. No meu tempo livre, eu gosto de ler, trabalhar em vários projetos paralelos e responder perguntas no StackOverflow.
Pós-navegação.
7 pensamentos sobre & ldquo; Trabalhando com processos em & rdquo;
É possível ler e escrever para o mesmo processo dentro do mesmo programa. Eu usei o shell medalhão para ler a saída de um programa de console interativo. Mas quando eu iniciar um segmento diferente para escrever comandos para o programa, o writestream. writeline parece apenas pendurar. Estou tentando controlar pianobar (veja github). Há algum passo ao tentar ler uma linha do processo e responder com uma linha. Isto está me enlouquecendo.
Sim, deve ser possível ler e escrever para um processo dentro do mesmo programa. Certifique-se de que está usando a versão mais recente do MedallionShell e que a entrada padrão do comando está definida como AutoFlush (deve ser o padrão).
Você pode observar WriteLine para pendurar se o processo de destino não for puxar os dados e o buffer interprocesso for preenchido (evitando assim que o preenchimento seja concluído).
É difícil para mim dizer mais sem ver o seu código; considere postar uma descrição mais detalhada e uma amostra de código como um problema em https: // github / madelson / MedallionShell.
Obrigado Michael. Eu fiz exatamente isso, o problema # 9 #. Liguei a minha pergunta. Claramente, eu estava com muito sono para escrever qualquer coisa. Eu quis dizer que há algum passo que é necessário que eu esteja faltando. Algo óbvio para todos os outros por mim.
É possível aguardar uma string específica no fluxo de saída do comando?
bool found = await cmd. StandardOutput. Expect (searchstring, timeout);
Não há funcionalidades incorporadas para fazer isso. Se a string não abranger uma linha, você poderia fazer:
enquanto ((linha = cmd. StandardOutput. ReadLine ())! = null)
Se a cadeia de pesquisa abranger várias linhas, você pode usar uma técnica de loop semelhante, onde você acompanha os últimos N caracteres onde N é o comprimento da seqüência de pesquisa.

Esperando um processo com tempo limite em.
Na mesma linha da minha última publicação, podemos querer ser mais inteligentes sobre o lançamento de um processo e aguardamos a saída.
Particularmente, se esse processo for parte de um sistema crítico, como seu processo de compilação, você não quer que um processo suspenso seja capaz de fazer com que seu sistema de compilação inteiro pare de morrer nas suas faixas.
Felizmente, o Processo tem uma sobrecarga de WaitForExit que leva um tempo limite inteiro e retorna um booleano - verdadeiro se o processo for encerrado ou falso se o processo não acontecesse.
Usando esta função, podemos escrever um método como este:
Neste trecho, OutputDataReceived é um evento que dispara quando o processo grava dados em saída padrão e sinais BeginOutputReadLine para que configuramos nosso evento e estamos prontos para começar a ouvir a saída do processo.
Usar o formulário de evento neste caso significa que não precisamos ter o texto de saída completo do processo na memória em nenhum momento. À medida que o processo escreve uma linha de texto, teremos apenas essa linha na memória, e isso será coletado por lixo depois de atualizar nosso contador.
Há dois "gotcha" s neste trecho, no entanto.
O primeiro é process. Kill (). Esta é uma condição de corrida clássica - entre o tempo em que nosso processo retorna de process. WaitForExit () e invoca processo. Kill (), o processo de destino pode sair. Nesse caso, o MSDN afirma que, se você chamar. Kill () em um processo que já saiu, você receberá uma InvalidOperationException.
Podemos corrigir isso, manipulando a exceção, assim:
O segundo "gotcha" é muito sutil, e você provavelmente não o achará até que a função não retorne o resultado esperado, ou até se sentar e ler toda a página de documentação para Process. WaitForExit (int). O MDSN afirma que:
Quando a saída padrão foi redirecionada para manipuladores de eventos assíncronos, é possível que o processamento de saída não seja concluído quando esse método retornar. Para garantir que o tratamento de eventos assíncrono tenha sido concluído, chame a sobrecarga WaitForExit () que não leva nenhum parâmetro depois de receber uma verdade dessa sobrecarga.
Nesse caso, é possível que nossa função GetNumOutputChars devolva um valor que contenha menos caracteres do que a saída real do processo, a menos que chamemos WaitForExit () novamente.
Com isso em mente, nossa função de segurança final agora se parece com isto:

Exemplo de uso.
Resolvi assim:
Eu redirecionava a entrada, a saída e o erro e administrai a leitura dos fluxos de saída e erro. Esta solução funciona para o SDK 7- 8.1, tanto para o Windows 7 como para o Windows 8.
Eu tentei fazer uma aula que resolva seu problema usando a leitura de fluxo assíncrono, levando em conta Mark Byers, Rob, Stevejay responde. Ao fazê-lo, percebi que existe um erro relacionado à leitura assíncrona do fluxo de saída do processo.
Você não pode fazer isso:
Você receberá System. InvalidOperationException: StandardOut não foi redirecionado ou o processo ainda não começou.
Então, você deve iniciar a saída assíncrona lida após o processo ser iniciado:
Fazendo isso, faça uma condição de corrida porque o fluxo de saída pode receber dados antes de configurá-lo como assíncrono:
Então algumas pessoas podem dizer que você só precisa ler o fluxo antes de configurá-lo como assíncrono. Mas o mesmo problema ocorre. Haverá uma condição de corrida entre a leitura síncrona e configurará o fluxo em modo assíncrono.
Não há como conseguir uma leitura assíncrona segura de um fluxo de saída de um processo na forma real "Processo" e "ProcessStartInfo" foi projetado.
Você provavelmente está melhor usando a leitura assíncrona, como sugerido por outros usuários para o seu caso. Mas você deve estar ciente de que você pode perder algumas informações devido à condição de corrida.
Nenhuma das respostas acima está fazendo o trabalho.
A solução Rob trava e a solução 'Mark Byers' obtém a exceção descarta. (Eu tentei as "soluções" das outras respostas).
Então eu decidi sugerir outra solução:
Este código é depurado e funciona perfeitamente.
Eu acho que isso é uma abordagem simples e melhor (não precisamos do AutoResetEvent):
Eu estava tendo o mesmo problema, mas a razão era diferente. No entanto, isso aconteceria no Windows 8, mas não no Windows 7. A seguinte linha parece ter causado o problema.
A solução era NÃO desativar UseShellExecute. Agora recebi uma janela popup do Shell, que é indesejável, mas muito melhor do que o programa esperando que nada de particular aconteça. Então eu adicionei o seguinte trabalho para isso:
Agora, o único problema que me incomoda é o porquê isso está acontecendo no Windows 8, em primeiro lugar.
Introdução.
A resposta atualmente aceita não funciona (lança exceção) e há muitas soluções alternativas, mas nenhum código completo. Isso é, obviamente, desperdiçando muito tempo das pessoas porque esta é uma questão popular.
Combinando a resposta de Mark Byers e a resposta de Karol Tyl, escrevi um código completo baseado em como eu quero usar o método Process. Start.
Eu usei-o para criar um diálogo de progresso em torno dos comandos git. É assim que eu usei isso:
Em teoria, você também pode combinar stdout e stderr, mas não testei isso.
Eu sei que isso é velho, mas, depois de ler toda essa página, nenhuma das soluções estava funcionando para mim, embora eu não tentei Muhammad Rehan porque o código era um pouco difícil de seguir, embora eu acho que ele estava no caminho certo . Quando eu digo que não funcionou, isso não é inteiramente verdade, às vezes funcionaria bem, acho que é algo a ver com a duração da saída antes de uma marca EOF.
De qualquer forma, a solução que funcionou para mim era usar diferentes threads para ler o StandardOutput e StandardError e escrever as mensagens.
Espero que isso ajude alguém, que pensou que isso poderia ser tão difícil!
As outras soluções (incluindo o EM0) ainda estão bloqueadas para o meu aplicativo, devido a tempos de espera internos e ao uso de StandardOutput e StandardError pela aplicação gerada. Aqui está o que funcionou para mim:
Editar: inicialização adicionada de StartInfo para codificar a amostra.
Este post talvez esteja desactualizado, mas descobri a principal causa por que normalmente ele trava é devido ao excesso de pilha para o redirectStandardoutput ou se você tem redirectStandarderror.
Como os dados de saída ou os dados de erro são grandes, isso causará um tempo de espera, pois ele ainda está processando por tempo indefinido.

No comments:

Post a Comment