понедельник, 21 мая 2018 г.

C # processo esperaforexit hasexited


Processo C # waitforexit hasexited
Obter através da App Store Leia esta publicação em nosso aplicativo!
Process. WaitForExit doesn & # 39; t retornam mesmo que Process. HasExited seja verdade.
Eu uso Process. Start para iniciar um arquivo em lote. O arquivo em lote usa o comando "INICIAR" para iniciar vários programas em paralelo e depois sai.
Uma vez que o arquivo em lote é feito Process. HasExited torna-se verdadeiro e Process. ExitCode contém o código de saída correto.
Mas quando chamo Process. WaitForExit (), ele trava / nunca retorna.
O código a seguir demonstra o problema. Ele cria um arquivo em lotes, o inicia e depois imprime:
Ele deve imprimir:
. mas nunca faz (mesmo que HasExited é verdadeiro e já temos um ExitCode).
Percebi que isso só ocorre quando o arquivo em lotes contém comandos "INICIAR" e quando a saída padrão e / ou o erro padrão são redirecionados.
Por que WaitForExit () nunca retorna?
Qual é o caminho certo para esperar que esse processo saia?
É seguro apenas pesquisar Process. HasExited ou isso pode resultar em outros problemas?
PS .: Eu notei que chamar WaitForExit (100000) com um tempo limite enorme (que definitivamente não expira) retorna imediatamente quando o processo sai. Wierd. Sem tempo limite, trava.
Isso parece ser um artefato (eu diria "bug") na implementação específica do tratamento assíncrono baseado em eventos do StandardOutput e do StandardError.
Percebi que, enquanto consegui reproduzir facilmente o seu problema, simplesmente executando o código que você forneceu (excelente exemplo de código, a propósito! :)), o processo realmente não foi suspenso indefinidamente. Em vez disso, ele retornou de WaitForExit () uma vez que ambos os processos filho que tinham sido iniciados já haviam saído.
Esta parece ser uma parte intencional da implementação da classe Process. Em particular, no método Process. WaitForExit (), uma vez que acabou de aguardar o processo, ele verifica se um leitor para stdout ou stderr foi criado; se assim for, e se o valor de tempo limite para a chamada WaitForExit () for "infinito" (ou seja, -1), o código realmente espera o fim do fluxo no (s) leitor (es).
Cada leitor respectivo é criado somente quando o método BeginOutputReadLine () ou BeginErrorReadLine () é chamado. Os fluxos stdout e stderr não estão fechados até que os processos filho tenham fechado. Então, esperando no final desses fluxos irá bloquear até que isso aconteça.
Que WaitForExit () deve se comportar de forma diferente, dependendo se um tenha chamado qualquer um dos métodos que iniciam a leitura baseada em eventos dos fluxos ou não, e especialmente porque a leitura desses fluxos diretamente não faz WaitForExit () se comportar desse jeito, cria uma inconsistência na API que torna muito mais difícil de entender e usar. Enquanto eu pessoalmente chamaria isso de bug, suponho que seja possível que o (s) implementador (es) da classe Process esteja ciente dessa inconsistência e criou de propósito.
Em qualquer caso, o trabalho seria ler StandardOutput e StandardError diretamente em vez de usar a parte baseada em eventos da API. (Embora, é claro, se o código de alguém aguardasse esses fluxos, verificaria o mesmo comportamento de bloqueio até que o filho fique próximo).
Por exemplo (C #, porque eu não sei F # bem o suficiente para tapar um exemplo de código como este juntos rapidamente :)):
Felizmente, o trabalho acima ou algo semelhante abordará o problema básico que você encontrou. Meus agradecimentos ao comentarista Niels Vorgaard Christensen por dirigir-me para as linhas problemáticas no método WaitForExit (), para que eu possa melhorar essa resposta.

Processo C # waitforexit hasexited
Obter através da App Store Leia esta publicação em nosso aplicativo!
C # Process. Start - como executar o WaitForExit.
Eu tenho um aplicativo de console que chama outros aplicativos de console.
Não consigo instanciar Processar e usar isso à medida que recebo a mensagem de erro "O executável especificado não é um aplicativo válido para esta plataforma de sistema operacional".
Posso chamar os aplicativos usando a versão estática do Processo, e.
No entanto, não posso obter o Processo para WaitForExit - um aplicativo é chamado e depois de um tempo, antes do primeiro aplicativo, o segundo é chamado - o que é um problema, pois depende do primeiro aplicativo a ser concluído.
Todas as sugestões sobre como obter a versão estática do Processo para aguardar a saída (alt. Como instanciar o Processo e poder chamar aplicativos implantados em uma configuração de clique?)
Process. Start Method (String, String) possui um valor de retorno do System. Diagnostics. Process.
Um novo processo que está associado ao recurso de processo ou nulo se nenhum recurso de processo for iniciado. Observe que um novo processo iniciado ao lado das instâncias já executadas do mesmo processo será independente dos outros. Além disso, Start pode retornar um processo não nulo com sua propriedade HasExited já definida como verdadeira. Nesse caso, o processo iniciado pode ter ativado uma instância existente por si só e depois encerrado.
Então eu verificaria se process. HasExited é verdadeiro antes de chamar WaitForExit.
Ok, depois de golpear minha cabeça contra uma parede durante a melhor parte de um dia, achei isso. Inicie um aplicativo ClickOnce off-line e aguarde Sair.
Usou a opção mutex. Fek me Microsoft, você pegou algo que costumava ser realmente simples e fez uma bunda de cavalo real fora disso.
Eu estava prestes a retirar meu chamado de exe e criar um monstro - estava me sentindo doente no pensamento.

Processo C # waitforexit hasexited
Obter através da App Store Leia esta publicação em nosso aplicativo!
C #: Process. HasExited retorna false mesmo que o processo tenha terminado.
Liguei para Kill () em um processo e parece ter saído. Mas quando eu testei HasExited, fico falso:
E isso continua indefinidamente. Concedido, eu tenho que mudar este código para parar de aguardar eventualmente, mas tenho curiosidade por porque HasExited ainda retorna falso quando o processo parece ter deixado o mapa por assim dizer.
Você está redirecionando a saída padrão? MSDN afirma o seguinte:
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 essa propriedade retornar verdadeira. Para garantir que o tratamento de eventos assíncrono tenha sido concluído, chame a sobrecarga WaitForExit () que não leva nenhum parâmetro antes de verificar HasExited.
De qualquer forma, a solução sugerida deve possivelmente fazer o truque:

Processo . Evento Exitado.
A documentação de referência da API tem uma nova casa. Visite o navegador da API no docs. microsoft para ver a nova experiência.
Ocorre quando um processo sai.
Assembly: System (no System. dll)
O evento Exit indicado indica que o processo associado foi encerrado. Esta ocorrência significa que o processo foi encerrado (abortado) ou fechado com sucesso. Esse evento pode ocorrer somente se o valor da propriedade EnableRaisingEvents for verdadeiro.
Há duas maneiras de ser notificado quando o processo associado sai: de forma síncrona e assíncrona. A notificação síncrona significa chamar o método WaitForExit para bloquear o segmento atual até o processo sair. A notificação assíncrona usa o evento Exitado, que permite que o segmento de chamada continue a ser executado entretanto. No último caso, EnableRaisingEvents deve ser definido como verdadeiro para o aplicativo de chamada para receber o evento Exited.
Quando o sistema operacional encerra um processo, ele notifica todos os outros processos que tenham registrado manipuladores para o evento Exitado. Neste momento, o controle do processo que acabou de sair pode ser usado para acessar algumas propriedades, como ExitTime e HasExited, que o sistema operacional mantém até liberar completamente isso.
Mesmo se você tiver um controle para um processo encerrado, você não pode chamar Iniciar novamente para se reconectar ao mesmo processo. Chamar o Início inicia automaticamente o processo associado e se conecta a um processo com o mesmo arquivo, mas um Handle totalmente novo.
Para obter mais informações sobre o uso do evento Exitado em aplicativos do Windows Forms, consulte a propriedade SynchronizingObject.
O exemplo de código a seguir cria um processo que imprime um arquivo. Ele levanta o evento Exitado quando o processo é encerrado porque a propriedade EnableRaisingEvents foi definida quando o processo foi criado. O manipulador de eventos Exit apresenta as informações do processo.
para uma confiança total para o chamador imediato. Este membro não pode ser usado por código parcialmente confiável.

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.
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.
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.
para resolver esse problema:
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.
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!
Depois de ler todos os posts aqui, resolvi a solução consolidada de Marko Avlijaš. No entanto, não resolveu todos os meus problemas.
Em nosso ambiente, temos um Serviço do Windows que está programado para executar centenas de diferentes. bat. cmd. exe. etc arquivos que se acumularam ao longo dos anos e foram escritas por muitas pessoas diferentes e em diferentes estilos. Não temos controle sobre a redação dos programas e programas; scripts, somos apenas responsáveis ​​pelo agendamento, execução e relatórios sobre o sucesso / falha.
Então eu tentei praticamente todas as sugestões aqui com diferentes níveis de sucesso. A resposta de Marko foi quase perfeita, mas quando executado como um serviço, ele nem sempre captou stdout. Nunca cheguei ao fundo do porquê não.

Processo C # waitforexit hasexited
Neste método, como um experimento, tentei configurar todos os privilégios para ver se talvez estivesse faltando um, mas geralmente vou configurar o TCB (se esse for o certo para definir).
Confira meu blog no tjoe. wordpress.
No lado esquerdo, certifique-se de que está entre parênteses (é agora) e jogue-o como em.
Dicas do mês:
- antes de fazer uma pergunta aqui, procure CodeProject, depois Google;
- a qualidade e os detalhes da sua pergunta refletem a eficácia da ajuda que você provavelmente obterá;
- use etiquetas PRE para preservar a formatação ao exibir trechos de código de várias linhas.
Mesmo no modo de depuração, ele mostra WordProcess. HasExited == verdadeiro logo após o início do processo.
Além disso, a janela não abre maximizada.
Por favor ajude! Obrigado!
Eu tenho uma classe expondo um método público que limpa um objeto de fila. Em um formulário usando este objeto, ao chamar esse método ... está causando uma exceção: Método não encontrado.
Quais são as soluções possíveis?
A mensagem Exception deve indicar o nome do método que falta.
- não há nenhum método com esse nome.
- não existe um método que leve parâmetros deste tipo.
- não há nenhum método com esse tempo de retorno.
ou o aplicativo carrega as montagens de clr erradas (1.1 em vez de 2.0)
"Eu acho que é o que separa os profissionais do arrastar e soltar, feminino wirly, namby pamby, wishy washy, não pode codificar para tipos de enxertos." - Pete O'Hanlon.
A felicidade em pessoas inteligentes é a coisa mais rara que eu conheço. - Ernest Hemingway.
Deja View - a sensação de que você já viu essa publicação antes.
a classe em um projeto e o chamador está em outro projeto ... tanto c #
. Durante a execução / depuração, a exceção "Método não encontrado" é aumentada!
Alguma ideia ou guia sobre como? estou cansado.
2. Não selecione nenhum item na Tira do Contexto.
3. Selecione qualquer TreeNode no Treeview. Agora o menu de contexto desaparece. (Isto é bom)
4. Pressione qualquer tecla do teclado. Nada está funcionando. O controle ainda está.
com o menu popup ContextMenuStrip mesmo que tenha desaparecido.
Como resolver este problema ?. Como desativar o evento Key down no ContextMemuStrip?
Eu adicionei o contextoMenuStrip em forma em tempo de design. Eu mostrei itens nele e use o evento do mouse para obter funcionalidades. Mas quando eu pressiono o evento Key down no menu de contexto e quando eu voltar para Treeview e pressionar Key down, o controle está indo para Contextmenu. É suposto ir para o Treeview.
Espero que tenha meu problema ...
É declarado como.
Mas o problema vem quando eu pressiono a tecla depois de mostrar o menu de contexto.
O controle depois disso para o keydown sempre vai ao menu de contexto. Por que não voltar para o Treeview para Keydown.
Pergunta de sugestão de notícias geral Resposta de erro Joke Praise Rant Admin.
Use Ctrl + Esquerda / Direita para alternar mensagens, Ctrl + Para cima / Para baixo para alternar threads, Ctrl + Shift + Esquerda / Direita para alternar páginas.

Комментариев нет:

Отправить комментарий