воскресенье, 6 мая 2018 г.

Msdn process waitforexit


Msdn process waitforexit
Eu tenho um aplicativo de console que chama outros aplicativos de console.
Eu não posso instanciar o processo e usar isso como eu recebo a mensagem de erro "O executável especificado não é um aplicativo válido para esta plataforma do sistema operacional."
Posso chamar os aplicativos usando a versão estática do processo, por exemplo
No entanto, não consigo obter o processo para WaitForExit - um aplicativo é chamado e depois de um tempo, antes que o primeiro aplicativo seja concluído, o segundo é chamado - o que é um problema, pois depende do primeiro aplicativo a ser concluído.
Alguma sugestão sobre como obter a versão estática do processo para aguardar a saída (por exemplo, como instanciar o processo e ser capaz de chamar os aplicativos implantados do clickonce?)
Process. Start Method (String, String) tem um valor de retorno de System. Diagnostics. Process.
Um novo processo que está associado ao recurso de processo ou nulo se nenhum recurso de processo for iniciado. Tenha em atenção que um novo processo iniciado juntamente com instâncias já em execução do mesmo processo será independente das outras. Além disso, Start pode retornar um processo não nulo com sua propriedade HasExited já definida como true. Nesse caso, o processo iniciado pode ter ativado uma instância existente e, em seguida, encerrado.
Então eu iria verificar se process. HasExited é true antes de chamar WaitForExit.
Ok, depois de bater a cabeça contra a parede durante a maior parte do dia, encontrei isso. Inicie um aplicativo ClickOnce off-line e aguarde a saída.
Usou a opção mutex. Me confunda com a Microsoft, você pega algo que costumava ser muito simples e fez um verdadeiro rabo de cavalo.
Eu estava prestes a descartar meus exe chamados e criar um monstro - estava me sentindo mal com o pensamento.

Msdn process waitforexit
Eu quero esperar por um processo para concluir, mas process. WaitForExit () trava minha GUI. Existe uma maneira baseada em eventos, ou eu preciso gerar um thread para bloquear até sair e delegar o evento eu mesmo?
A partir do. NET 4.0 / C # 5, é melhor representá-lo usando o padrão assíncrono.
Se você escolher a resposta @MgSam, esteja ciente, se você passar por WaitForExitAsync algum CancellationToken, que será automaticamente cancelado após o atraso especificado, você poderá obter uma InvalidOperationException. Para corrigir isso, você precisa mudar.

Método Process. WaitForExit ()
Instrui o componente Process a aguardar indefinidamente que o processo associado seja encerrado.
Exceções.
Não há processo associado a este objeto Process.
Você está tentando chamar WaitForExit para um processo em execução em um computador remoto. O método está disponível apenas para processos em execução no computador local.
WaitForExit é usado para fazer o thread atual esperar até que o processo associado termine.
Essa sobrecarga de WaitForExit instrui o componente Process a aguardar uma quantidade infinita de tempo para o processo sair. Isso pode fazer com que um aplicativo pare de responder. Por exemplo, se você chamar CloseMainWindow para um processo que tenha uma interface com o usuário, a solicitação para o sistema operacional finalizar o processo associado poderá não ser tratada se o processo for gravado para nunca inserir seu loop de mensagem.
Quando um processo associado sai (é encerrado pelo sistema operacional através de uma finalização normal ou anormal), o sistema armazena informações administrativas sobre o processo e retorna ao componente que chamou WaitForExit. O componente de processo pode acessar as informações, que inclui o ExitTime, usando o identificador para o processo de saída.
Como o processo associado foi encerrado, a propriedade Handle do componente não aponta mais 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 identificadores para processos que não foram liberados pelos componentes do processo, portanto, ele mantém as informações de ExitTime e identificador na memória até que o componente de processo especificamente libera os recursos. Por esse motivo, sempre que você chamar a instância Start for Process, chame Close quando o processo associado tiver terminado e você não precisar mais de nenhuma informação administrativa sobre ele. Close libera a memória alocada para o processo finalizado.
Requisitos
Plataformas: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, família Windows Server 2003.

Processo . Método WaitForExit ()
A documentação de referência da API. NET tem uma nova página. Visite o Navegador da API. NET em docs. microsoft para ver a nova experiência.
Instrui o componente Process a aguardar indefinidamente que o processo associado seja encerrado.
Assembly: System (no System. dll)
A configuração de espera não pôde ser acessada.
Nenhuma identificação de processo foi definida e uma Handle da qual a propriedade Id pode ser determinada não existe.
Não há processo associado a este objeto Process.
Você está tentando chamar WaitForExit () para um processo que está sendo executado em um computador remoto. Este método está disponível apenas para processos em execução no computador local.
WaitForExit () faz com que o segmento atual espere até que o processo associado termine. Deve ser chamado depois que todos os outros métodos forem chamados no processo. Para evitar o bloqueio do segmento atual, use o evento Exited.
Este método instrui o componente Process a aguardar uma quantidade infinita de tempo para que os manipuladores de processo e evento saiam. Isso pode fazer com que um aplicativo pare de responder. Por exemplo, se você chamar CloseMainWindow para um processo que tenha uma interface com o usuário, a solicitação para o sistema operacional finalizar o processo associado poderá não ser tratada se o processo for gravado para nunca inserir seu loop de mensagem.
No. NET Framework 3.5 e versões anteriores, a sobrecarga WaitForExit () aguardou milissegundos MaxValue (aproximadamente 24 dias), não indefinidamente. Além disso, as versões anteriores não esperavam que os manipuladores de eventos saíssem se o tempo máximo de MaxValue fosse atingido.
Essa sobrecarga assegura que todo o processamento tenha sido 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 WaitForExit (Int32) quando a saída padrão tiver sido redirecionada para manipuladores de eventos assíncronos.
Quando um processo associado é encerrado (ou seja, quando é encerrado pelo sistema operacional por meio de uma finalização normal ou anormal), o sistema armazena informações administrativas sobre o processo e retorna ao componente que chamou WaitForExit (). O componente de processo pode acessar as informações, que inclui o ExitTime, usando o identificador para o processo de saída.
Como o processo associado foi encerrado, a propriedade Handle do componente não aponta mais 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 identificadores para processos que não foram liberados pelos componentes do processo, portanto, ele mantém as informações de ExitTime e identificador na memória até que o componente de processo especificamente libera os recursos. Por esse motivo, sempre que você chamar a instância Start for Process, chame Close quando o processo associado tiver terminado e você não precisar mais de nenhuma informação administrativa sobre ele. Close libera a memória alocada para o processo finalizado.

Msdn process waitforexit
Dentro de um aplicativo que estou escrevendo, preciso fazer o seguinte:
Execute um aplicativo GUI externo (para os propósitos deste exemplo, vamos assumir o seu MS Word). Bloqueie o encadeamento atual até que o aplicativo GUI externo tenha sido fechado.
Minha primeira tentativa de fazer isso foi fazer uso do objeto System. Diagnostics. Process.
// Inicialize o objeto de processo.
myProcess. StartInfo. FileName = & quot; C: \\ Arquivos de Programas \\ Microsoft Office \\ OFFICE11 \\ Winword. exe & quot ;;
myProcess. StartInfo. WorkingDirectory = & quot; C: \\ Arquivos de Programas \\ Microsoft Office \\ OFFICE11 & quot ;;
// Inicie o processo e espere que ele seja fechado.
System. Windows. Forms. MessageBox. Show (& quot; Aplicativo do usuário fechado & quot;);
Quando executo o código acima, o MS Word é iniciado conforme o esperado. No entanto, a chamada WaitForExit () não parece estar fazendo seu trabalho como eu obter o instantâneo de caixa de mensagem instantaneamente após o processo do MS Word é iniciado e não depois que ele for fechado.
Por que a chamada WaitForExit () não aguarda o término do processo do MSWord? O fato de eu estar lançando um aplicativo GUI em vez de um aplicativo de linha de comando é significativo?
Qualquer ajuda seria muito apreciada.
Todas as respostas.
Depois de alguns testes conclui que é porque não há um documento do usuário carregado. se você tornar o parâmetro filename um documento real, tudo funcionará como esperado:
// Inicie o processo e espere que ele seja fechado.
System. Windows. Forms. MessageBox. Show (& quot; Aplicativo do usuário fechado & quot;);
Se um documento é carregado ou não, não importa? O objeto Process fornece apenas uma maneira genérica de executar e monitorar processos, ele não sabe nada sobre as partes internas do que o Word carregou com segurança?
Em qualquer caso, tentei o código conforme recomendado e recebi uma exceção "Nenhum processo associado a este objeto", presumivelmente porque foi passado o nome do arquivo de um documento em vez de um executável.

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

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