Wednesday 18 April 2018

Usando o processo waitforexit c #


Usando process. waitforexit c #
Obter através da App Store Leia esta publicação em nosso aplicativo!
Aguarde até um processo terminar.
Eu tenho um aplicativo que faz.
para iniciar outro aplicativo 'ABC'. Eu quero aguardar até que o aplicativo final (processo morre) e continuar minha execução. Como eu posso fazer isso?
Pode haver várias instâncias do aplicativo 'ABC' executando ao mesmo tempo.
Eu acho que você só quer isso:
Consulte a página MSDN para o método. Também tem uma sobrecarga onde você pode especificar o tempo limite, então você não está esperando potencialmente para sempre.
Use Process. WaitForExit? Ou assine o evento Process. Exited se você não quer bloquear? Se isso não fizer o que você quer, por favor nos dê mais informações sobre seus requisitos.
Faço o seguinte na minha aplicação:
Há alguns recursos extras lá que você pode achar úteis.
Você pode usar a espera para sair ou você pode pegar a propriedade HasExited e atualizar sua UI para manter o usuário "informado" (gerenciamento de expectativa):

Usando process. waitforexit c #
Obter através da App Store Leia esta publicação em nosso aplicativo!
process. WaitForExit () de forma assíncrona.
Quero aguardar um processo para terminar, mas process. WaitForExit () trava minha GUI. Existe uma maneira baseada em eventos, ou eu preciso gerar um segmento para bloquear até sair, depois delegar o evento eu mesmo?
A partir de 4.0 / C # 5, é melhor representar isso usando o padrão assíncrono.
Se você escolher a resposta @MgSam, esteja ciente, se você passar por WaitForExitAsync algum CancelamentoToken, que será automaticamente cancelado após o atraso especificado, você pode obter uma InvalidOperationException. Para corrigir isso, você precisa mudar.
P. S .: não esqueça de dispor o seu CancelamentoTokenSource no tempo.
De acordo com este link, o método WaitForExit () é usado para fazer o thread atual aguardar até o processo associado terminar. No entanto, o processo possui um evento Exitado ao qual você pode se conectar.

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.

Метод Process. WaitForExit (Int32)
Опубликовано: Октябрь 2018.
Дает компоненту Processo команду ожидать завершения связанного процесса в течение указанного времени в миллисекундах.
Количество времени в миллисекундах для ожидания завершения связанного процесса. Максимальным является наибольшее возможное 32-битное целое число, которое представляет для операционной системы бесконечность.
Возвращаемое значение.
Значение true, если связанный процесс завершился; в противном случае - значение false.
Нет доступа к параметру ожидания.
Не задан Id процесса, и Manipular, из которого можно определить свойство Id, ну существует.
С этим объектом Processo никакие процессы не связаны.
Você está certo para WaitForExit (Int32) для процесса, запущенного на удаленном компьютере. Вы пытаетесь вызвать метод WaitForExit (Int32) для процесса, запущенного на удаленном компьютере. Этот метод доступен только для процессов, запущенных на локальном компьютере.
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. Para evitar o bloqueio do segmento atual, use o evento Exitado.
Esse método instrui o componente T: System. Diagnostics. Process para aguardar uma quantidade de tempo finito para o processo sair. Se o processo associado não sair pelo final do intervalo porque a solicitação de término é negada, o falso é retornado ao procedimento de chamada. Você pode especificar um número negativo (F: System. Threading. Timeout. Infinite) por milissegundos e M: System. Diagnostics. Process. WaitForExit (System. Int32) se comportará da mesma forma que o M: System. Diagnostics. Process. WaitForExit sobrecarga. Se você passar 0 (zero) para o método, ele retorna verdadeiro somente se o processo já foi encerrado; Caso contrário, ele retorna imediatamente falso.
Nas versões net_v35_long e anterior, se milissegundos foi -1, a sobrecarga M: System. Diagnostics. Process. WaitForExit (System. Int32) esperava F: System. Int32.MaxValue milissegundos (aproximadamente 24 dias), não indefinidamente.
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íncronos tenha sido concluído, chame a sobrecarga M: System. Diagnostics. Process. WaitForExit que não leva nenhum parâmetro depois de receber uma verdade dessa sobrecarga. Para ajudar a garantir que o evento E: System. Diagnostics. Process. Exited seja tratado corretamente nas aplicações Windows Forms, defina a propriedade P: System. Diagnostics. Process. SynchronizingObject.
Quando um processo associado é encerrado (é encerrado pelo sistema operacional através de uma terminação normal ou anormal), o sistema armazena informações administrativas sobre o processo e retorna ao componente que chamou de M: System. Diagnostics. Process. WaitForExit (System. Int32 ). O componente T: System. Diagnostics. Process pode acessar a informação, que inclui o P: System. Diagnostics. Process. ExitTime, usando o P: System. Diagnostics. Process. Handle para o processo encerrado.
Como o processo associado saiu, a propriedade P: System. Diagnostics. Process. Handle do componente não mais aponta para um recurso de processo existente. Em vez disso, o identificador pode ser usado apenas para acessar as informações do sistema operacional sobre o recurso do processo. O sistema está ciente de alças para processos que não foram lançados pelos componentes T: System. Diagnostics. Process, portanto, ele mantém o P: System. Diagnostics. Process. ExitTime e P: System. Diagnostics. Process. Handle informações na memória até o componente T: System. Diagnostics. Process especificamente liberta os recursos. Por esse motivo, sempre que você ligar para M: System. Diagnostics. Process. Start para uma instância T: System. Diagnostics. Process, ligue para M: System. Diagnostics. Process. Close quando o processo associado terminou e você não precisa mais de nenhum informações administrativas sobre isso. M: System. Diagnostics. Process. Close libera a memória alocada para o processo encerrado.
Consulte o exemplo de código para a propriedade P: System. Diagnostics. Process. ExitCode.
para uma confiança total para o chamador imediato. Este membro não pode ser usado por código parcialmente confiável.

Метод Process. WaitForExit ()
Опубликовано: Октябрь 2018.
Дает компоненту processo команду ожидать завершения связанного процесса в течение неограниченного времени.
Нет доступа к параметру ожидания.
Не задан Id процесса, и Manipular, из которого можно определить свойство Id, ну существует.
С этим объектом Processo никакие процессы не связаны.
Você pode ver o WaitForExit () для процесса, выполняющегося на удаленном компьютере. Вы пытаетесь вызвать метод WaitForExit () для процесса, выполняющегося на удаленном компьютере. Этот метод доступен только для процессов, запущенных на локальном компьютере.
WaitForExit () 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. Para evitar o bloqueio do segmento atual, use o evento Exitado.
Este método instrui o componente T: System. Diagnostics. Process para aguardar uma quantidade infinita de tempo para que o processo e os manipuladores de eventos saem. Isso pode fazer com que um aplicativo pare de responder. Por exemplo, se você chamar M: System. Diagnostics. Process. CloseMainWindow para um processo que tenha uma interface de usuário, a solicitação ao sistema operacional para encerrar o processo associado pode não ser tratada se o processo for gravado para nunca entrar em seu loop de mensagem .
Nas versões net_v35_long e anteriores, a sobrecarga M: System. Diagnostics. Process. WaitForExit aguardava F: System. Int32.MaxValue milissegundos (aproximadamente 24 dias), não indefinidamente. Além disso, as versões anteriores não esperaram que os manipuladores de eventos saíssem se o tempo total F: System. Int32.MaxValue fosse atingido.
Esta sobrecarga garante que todo o processamento foi concluído, incluindo o tratamento de eventos assíncronos para saída padrão redirecionada. Você deve usar essa sobrecarga após uma chamada para a sobrecarga M: System. Diagnostics. Process. WaitForExit (System. Int32) quando a saída padrão foi redirecionada para manipuladores de eventos assíncronos.
Quando um processo associado sai (ou seja, quando é encerrado pelo sistema de operação através de uma terminação normal ou anormal), o sistema armazena informações administrativas sobre o processo e retorna ao componente que chamou M: System. Diagnostics. Process. WaitForExit. O componente T: System. Diagnostics. Process pode acessar a informação, que inclui o P: System. Diagnostics. Process. ExitTime, usando o P: System. Diagnostics. Process. Handle para o processo encerrado.
Como o processo associado saiu, a propriedade P: System. Diagnostics. Process. Handle do componente não mais aponta para um recurso de processo existente. Em vez disso, o identificador pode ser usado apenas para acessar as informações do sistema operacional sobre o recurso do processo. O sistema está ciente de alças para processos que não foram lançados pelos componentes T: System. Diagnostics. Process, portanto, ele mantém o P: System. Diagnostics. Process. ExitTime e P: System. Diagnostics. Process. Handle informações na memória até o componente T: System. Diagnostics. Process especificamente liberta os recursos. Por esse motivo, sempre que você ligar para M: System. Diagnostics. Process. Start para uma instância T: System. Diagnostics. Process, ligue para M: System. Diagnostics. Process. Close quando o processo associado terminou e você não precisa mais de nenhum informações administrativas sobre isso. M: System. Diagnostics. Process. Close libera a memória alocada para o processo encerrado.
Consulte a seção Comentários da página de referência de propriedade P: System. Diagnostics. Process. StandardError.
para uma confiança total para o chamador imediato. Este membro não pode ser usado por código parcialmente confiável.

No comments:

Post a Comment