четверг, 14 июня 2018 г.

Exemplo de waitforexit net process


Exemplo de waitforexit do processo. net
Quando você cria seu objeto Process, defina StartInfo apropriadamente:
então inicie o processo e leia:
Você pode usar int. Parse () ou int. TryParse () para converter as cadeias em valores numéricos. Você pode ter que fazer alguma manipulação de seqüência de caracteres primeiro se houver caracteres numéricos inválidos nas seqüências de caracteres que você lê.
Você pode processar sua saída de forma síncrona ou assíncrona.
Observe que é melhor processar a saída e os erros: eles devem ser tratados separadamente.
(*) Para alguns comandos (aqui StartInfo. Arguments) você deve adicionar a diretiva / c, caso contrário, o processo congela no WaitForExit ().
Se você não precisa complicar as operações com a saída, você pode ignorar o método OutputHandler, apenas adicionando os manipuladores diretamente em linha:
A maneira padrão do. NET de fazer isso é ler o fluxo StandardOutput do Processo. Há um exemplo nos documentos do MSDN vinculados. Semelhante, você pode ler a partir do StandardError e gravar em StandardInput.
Tudo bem, para qualquer um que queira leitura de Erros e Saídas, mas receba deadlocks com qualquer uma das soluções, fornecidas em outras respostas (como eu), aqui está uma solução que construí depois de ler a explicação do MSDN para a propriedade StandardOutput.
A resposta é baseada no código do T30:
você pode usar a memória compartilhada para os 2 processos para se comunicar, confira MemoryMappedFile.
você criará principalmente um arquivo de memória mapeado mmf no processo pai usando a instrução "using" e então criará o segundo processo até que ele termine e deixe gravar o resultado para o mmf usando BinaryWriter, então leia o resultado do mmf usando o processo pai , você também pode passar o nome mmf usando argumentos de linha de comando ou codificar isso.
Verifique se, ao usar o arquivo mapeado no processo pai, você faz o processo filho gravar o resultado no arquivo mapeado antes que o arquivo mapeado seja liberado no processo pai.
Exemplo: processo pai.
Para usar este exemplo, você precisará criar uma solução com dois projetos dentro, então você pega o resultado de compilação do processo filho de% childDir% / bin / debug e copia para% parentDirectory% / bin / debug, em seguida, executa o projeto pai.
childDir e parentDirectory são os nomes das pastas dos seus projetos no pc boa sorte :)

Propriedade Process. StandardError.
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.
Obtém um fluxo usado para ler a saída de erro do aplicativo.
Assembly: System (no System. dll)
Valor da propriedade.
Um StreamReader que pode ser usado para ler o fluxo de erros padrão do aplicativo.
O fluxo StandardError foi aberto para operações de leitura assíncrona com BeginErrorReadLine.
Quando um processo grava texto em seu fluxo de erro padrão, esse texto é normalmente exibido no console. Ao redirecionar o fluxo StandardError, você pode manipular ou suprimir a saída de erro de um processo. Por exemplo, você pode filtrar o texto, formatá-lo de maneira diferente ou gravar a saída no console e em um arquivo de log designado.
Para usar o StandardError, você deve definir ProcessStartInfo. UseShellExecute como false e deve definir ProcessStartInfo. RedirectStandardError como true. Caso contrário, a leitura do fluxo StandardError gerará uma exceção.
O fluxo StandardError redirecionado pode ser lido de forma síncrona ou assíncrona. Métodos como Read, ReadLine e ReadToEnd executam operações de leitura síncrona no fluxo de saída de erro do processo. Essas operações de leitura síncrona não são concluídas até que o Processo associado grave em seu fluxo StandardError ou feche o fluxo.
Por outro lado, BeginErrorReadLine inicia operações de leitura assíncrona no fluxo StandardError. Esse método ativa um manipulador de eventos designado para a saída do fluxo e retorna imediatamente ao responsável pela chamada, que pode executar outro trabalho enquanto a saída do fluxo é direcionada para o manipulador de eventos.
As operações de leitura síncrona introduzem uma dependência entre a leitura do responsável pela chamada do fluxo StandardError e a gravação do processo filho nesse fluxo. Essas dependências podem resultar em condições de deadlock. Quando o chamador lê o fluxo redirecionado de um processo filho, ele depende do filho. O chamador aguarda na operação de leitura até que o filho grave no fluxo ou feche o fluxo. Quando o processo filho grava dados suficientes para preencher seu fluxo redirecionado, ele depende do pai. O processo filho aguarda na próxima operação de gravação até que o pai leia o fluxo completo ou feche o fluxo. A condição de deadlock resulta quando o chamador e o processo filho aguardam um ao outro para concluir uma operação e nenhum deles pode prosseguir. Você pode evitar deadlocks avaliando dependências entre o chamador e o processo filho.
O seguinte código C #, por exemplo, mostra como ler de um fluxo redirecionado e aguardar a saída do processo filho.
O exemplo de código evita uma condição de deadlock chamando p. StandardError. ReadToEnd antes de p. WaitForExit. Uma condição de deadlock pode resultar se o processo pai chama p. WaitForExit antes de p. StandardError. ReadToEnd e o processo filho grava texto suficiente para preencher o fluxo redirecionado. O processo pai aguardaria indefinidamente que o processo filho fosse encerrado. O processo filho esperaria indefinidamente que o pai lesse o fluxo completo do StandardError.
Há um problema semelhante quando você lê todo o texto da saída padrão e dos fluxos de erro padrão. O seguinte código C #, por exemplo, executa uma operação de leitura nos dois fluxos.
O exemplo de código evita a condição de deadlock executando operações de leitura assíncrona no fluxo StandardOutput. Uma condição de deadlock resulta se o processo pai chamar p. StandardOutput. ReadToEnd seguido por p. StandardError. ReadToEnd e o processo filho grava texto suficiente para preencher seu fluxo de erro. O processo pai esperaria indefinidamente que o processo filho fechasse seu fluxo StandardOutput. O processo filho esperaria indefinidamente que o pai lesse o fluxo completo do StandardError.
Você pode usar operações de leitura assíncronas para evitar essas dependências e seu potencial de deadlock. Como alternativa, você pode evitar a condição de deadlock criando dois threads e lendo a saída de cada fluxo em um thread separado.
Você não pode mesclar operações de leitura assíncrona e síncrona em um fluxo redirecionado. Depois que o fluxo redirecionado de um processo é aberto no modo assíncrono ou síncrono, todas as operações de leitura adicionais nesse fluxo devem estar no mesmo modo. Por exemplo, não siga BeginErrorReadLine com uma chamada para ReadLine no fluxo StandardError ou vice-versa. No entanto, você pode ler dois fluxos diferentes em modos diferentes. Por exemplo, você pode chamar BeginOutputReadLine e, em seguida, chamar ReadLine para o fluxo StandardError.

Classe de processo.
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.
Fornece acesso a processos locais e remotos e permite iniciar e parar processos do sistema local.
Para procurar o código-fonte do. NET Framework para esse tipo, consulte a fonte de referência.
Assembly: System (no System. dll)
Inicializa uma nova instância da classe Process.
Obtém a prioridade básica do processo associado.
Obtém um valor indicando se o componente pode gerar um evento (herdado do componente).
Obtém o IContainer que contém o componente. (Herdado do componente.)
Obtém um valor que indica se o componente está atualmente no modo de design. (Herdado do componente.)
Obtém ou define se o evento Exited deve ser gerado quando o processo é finalizado.
Obtém a lista de manipuladores de eventos que estão anexados a este componente. (Herdado do componente.)
Obtém o valor que o processo associado especificou quando foi finalizado.
Obtém o tempo que o processo associado foi encerrado.
Obtém o identificador nativo do processo associado.
Obtém o número de identificadores abertos pelo processo.
Obtém um valor indicando se o processo associado foi finalizado.
Obtém o identificador exclusivo para o processo associado.
Obtém o nome do computador no qual o processo associado está sendo executado.
Obtém o módulo principal do processo associado.
Obtém o identificador de janela da janela principal do processo associado.
Obtém a legenda da janela principal do processo.
Obtém ou define o tamanho máximo permitido do conjunto de trabalho, em bytes, para o processo associado.
Obtém ou define o tamanho mínimo permitido do conjunto de trabalho, em bytes, para o processo associado.
Obtém os módulos que foram carregados pelo processo associado.
Obsoleto. Obtém a quantidade de memória do sistema não paginada, em bytes, alocada para o processo associado.
Obtém a quantidade de memória do sistema não paginada, em bytes, alocada para o processo associado.
Obsoleto. Obtém a quantidade de memória paginada, em bytes, alocada para o processo associado.
Obtém a quantidade de memória paginada, em bytes, alocada para o processo associado.
Obsoleto. Obtém a quantidade de memória do sistema paginável, em bytes, alocada para o processo associado.
Obtém a quantidade de memória do sistema paginável, em bytes, alocada para o processo associado.
Obsoleto. Obtém a quantidade máxima de memória no arquivo de paginação da memória virtual, em bytes, usada pelo processo associado.
Obtém a quantidade máxima de memória no arquivo de paginação da memória virtual, em bytes, usada pelo processo associado.
Obsoleto. Obtém a quantidade máxima de memória virtual, em bytes, usada pelo processo associado.
Obtém a quantidade máxima de memória virtual, em bytes, usada pelo processo associado.
Obsoleto. Obtém o tamanho do conjunto de trabalho de pico para o processo associado, em bytes.
Obtém a quantidade máxima de memória física, em bytes, usada pelo processo associado.
Obtém ou define um valor indicando se a prioridade do processo associado deve ser temporariamente aumentada pelo sistema operacional quando a janela principal tiver o foco.
Obtém ou define a categoria de prioridade geral para o processo associado.
Obsoleto. Obtém a quantidade de memória privada, em bytes, alocada para o processo associado.
Obtém a quantidade de memória privada, em bytes, alocada para o processo associado.
Obtém o tempo de processador privilegiado para este processo.
Obtém o nome do processo.
Obtém ou define os processadores nos quais os threads neste processo podem ser planejados para serem executados.
Obtém um valor indicando se a interface do usuário do processo está respondendo.
Obtém o identificador nativo para esse processo.
Obtém o identificador de sessão dos Serviços de Terminal para o processo associado.
Obtém ou define o ISite do componente. (Herdado do componente.)
Obtém um fluxo usado para ler a saída de erro do aplicativo.
Obtém um fluxo usado para gravar a entrada do aplicativo.
Obtém um fluxo usado para ler a saída textual do aplicativo.
Obtém ou define as propriedades para passar para o método Start do processo.
Obtém o tempo que o processo associado foi iniciado.
Obtém ou define o objeto usado para empacotar as chamadas do manipulador de eventos que são emitidas como resultado de um evento de saída do processo.
Obtém o conjunto de threads que estão sendo executados no processo associado.
Obtém o tempo total do processador para este processo.
Obtém o tempo do processador do usuário para este processo.
Obsoleto. Obtém o tamanho da memória virtual do processo, em bytes.
Obtém a quantidade da memória virtual, em bytes, alocada para o processo associado.
Obsoleto. Obtém o uso da memória física do processo associado, em bytes.
Obtém a quantidade de memória física, em bytes, alocada para o processo associado.
Inicia operações de leitura assíncrona no fluxo StandardError redirecionado do aplicativo.
Inicia operações de leitura assíncrona no fluxo StandardOutput redirecionado do aplicativo.
Cancela a operação de leitura assíncrona no fluxo StandardError redirecionado de um aplicativo.
Cancela a operação de leitura assíncrona no fluxo StandardOutput redirecionado de um aplicativo.
Libera todos os recursos associados a esse componente.
Fecha um processo que possui uma interface de usuário enviando uma mensagem de fechamento para sua janela principal.
Cria um objeto que contém todas as informações relevantes necessárias para gerar um proxy usado para se comunicar com um objeto remoto. (Herdado de MarshalByRefObject.)
Libera todos os recursos usados ​​pelo Componente. (Herdado do Componente.)
Essa API suporta a infraestrutura do produto e não se destina a ser usada diretamente em seu código. Libere todos os recursos usados ​​por esse processo. (Substitui Component. Dispose (Boolean).)
Coloca um componente Process no estado para interagir com processos do sistema operacional executados em um modo especial, ativando a propriedade nativa SeDebugPrivilege no encadeamento atual.
Determina se o objeto especificado é igual ao objeto atual. (Herdado de Object.)
Libera recursos não gerenciados e executa outras operações de limpeza antes que o componente seja recuperado pela coleta de lixo. (Herdado do componente.)
Obtém um novo componente Process e o associa ao processo atualmente ativo.
Serve como a função hash padrão. (Herdado de Object.)
Recupera o objeto de serviço de vida útil atual que controla a diretiva de tempo de vida para essa instância. (Herdado de MarshalByRefObject.)
Retorna um novo componente Process, dado o identificador de um processo no computador local.
Retorna um novo componente Process, dado um identificador de processo e o nome de um computador na rede.
Cria um novo componente de processo para cada recurso de processo no computador local.
Cria um novo componente de processo para cada recurso de processo no computador especificado.
Cria uma matriz de novos componentes do processo e os associa a todos os recursos do processo no computador local que compartilham o nome do processo especificado.
Cria uma matriz de novos componentes do processo e os associa a todos os recursos do processo em um computador remoto que compartilha o nome do processo especificado.
Retorna um objeto que representa um serviço fornecido pelo Componente ou por seu Container. (Herdado do Componente.)
Obtém o Type da instância atual. (Herdado de Object.)
Obtém um objeto de serviço vitalício para controlar a diretiva de tempo de vida para essa instância. (Herdado de MarshalByRefObject.)
Imediatamente interrompe o processo associado.
Retira um componente de Processo do estado que permite interagir com processos do sistema operacional executados em um modo especial.
Cria uma cópia superficial do objeto atual. (Herdado de Object.)
Cria uma cópia superficial do objeto MarshalByRefObject atual. (Herdado de MarshalByRefObject.)
Gera o evento Exited.
Descarta qualquer informação sobre o processo associado que foi armazenado em cache dentro do componente do processo.
Inicia (ou reutiliza) o recurso de processo especificado pela propriedade StartInfo desse componente de processo e o associa ao componente.
Inicia o recurso de processo especificado pelo parâmetro que contém as informações de início do processo (por exemplo, o nome do arquivo do processo a ser iniciado) e associa o recurso a um novo componente do Processo.
Inicia um recurso de processo especificando o nome de um documento ou arquivo de aplicativo e associa o recurso a um novo componente de processo.
Inicia um recurso de processo especificando o nome de um aplicativo e um conjunto de argumentos de linha de comando e associa o recurso a um novo componente de processo.
Inicia um recurso de processo especificando o nome de um aplicativo, um nome de usuário, uma senha e um domínio e associa o recurso a um novo componente de processo.
Inicia um recurso de processo especificando o nome de um aplicativo, um conjunto de argumentos da linha de comandos, um nome de usuário, uma senha e um domínio e associa o recurso a um novo componente do processo.
Formata o nome do processo como uma string, combinada com o tipo de componente pai, se aplicável. (Substitui Component. ToString ().)
Instrui o componente Processo a aguardar indefinidamente que o processo associado seja encerrado.
Instrui o componente Processo a aguardar o número especificado de milissegundos para o processo associado sair.
Faz com que o componente Process espere indefinidamente que o processo associado entre em um estado inativo. Essa sobrecarga aplica-se apenas aos processos com uma interface com o usuário e, portanto, um loop de mensagem.
Faz com que o componente Process aguarde o número especificado de milissegundos para que o processo associado entre em um estado inativo. Essa sobrecarga aplica-se apenas aos processos com uma interface com o usuário e, portanto, um loop de mensagem.
Ocorre quando o componente é descartado por uma chamada para o método Dispose. (Herdado do componente).
Ocorre quando um aplicativo grava em seu fluxo StandardError redirecionado.
Ocorre quando um processo sai.
Ocorre toda vez que um aplicativo grava uma linha em seu fluxo StandardOutput redirecionado.
Para exibir o código-fonte do. NET Framework para esse tipo, consulte a fonte de referência. Você pode navegar pelo código-fonte on-line, fazer o download da referência para visualização off-line e percorrer as fontes (incluindo correções e atualizações) durante a depuração; veja instruções.
Um componente de processo fornece acesso a um processo que está sendo executado em um computador. Um processo, nos termos mais simples, é um aplicativo em execução. Um thread é a unidade básica na qual o sistema operacional aloca o tempo do processador. Um thread pode executar qualquer parte do código do processo, incluindo partes atualmente sendo executadas por outro thread.
O componente Processo é uma ferramenta útil para iniciar, parar, controlar e monitorar aplicativos. Você pode usar o componente Process, para obter uma lista dos processos em execução ou iniciar um novo processo. Um componente de processo é usado para acessar processos do sistema. Depois que um componente de processo foi inicializado, ele pode ser usado para obter informações sobre o processo em execução. Essas informações incluem o conjunto de threads, os módulos carregados (arquivos. dll e. exe) e informações de desempenho, como a quantidade de memória que o processo está usando.
Este tipo implementa a interface IDisposable. Quando você terminar de usar o tipo, você deve descartá-lo direta ou indiretamente. Para descartar o tipo diretamente, chame seu método Dispose em um bloco try / catch. Para descartá-lo indiretamente, use uma construção de linguagem, como usando (em C #) ou usando (no Visual Basic). Para obter mais informações, consulte a seção “Usando um objeto que implementa IDisposable” no tópico interface IDisposable.
Processos de 32 bits não podem acessar os módulos de um processo de 64 bits. Se você tentar obter informações sobre um processo de 64 bits de um processo de 32 bits, você receberá uma exceção Win32Exception. Um processo de 64 bits, por outro lado, pode acessar os módulos de um processo de 32 bits.
O componente do processo obtém informações sobre um grupo de propriedades de uma só vez. Depois que o componente Process tiver obtido informações sobre um membro de qualquer grupo, ele armazenará em cache os valores das outras propriedades nesse grupo e não obterá novas informações sobre os outros membros do grupo até você chamar o método Refresh. Portanto, não é garantido que um valor de propriedade seja mais recente que a última chamada para o método Refresh. As desagregações de grupo são dependentes do sistema operacional.
Se você tiver uma variável de caminho declarada em seu sistema usando aspas, deverá qualificar totalmente esse caminho ao iniciar qualquer processo encontrado nesse local. Caso contrário, o sistema não encontrará o caminho. Por exemplo, se c: \ mypath não estiver em seu caminho e você adicioná-lo usando aspas: path =% path%; "c: \ mypath", você deve qualificar totalmente qualquer processo em c: \ mypath ao iniciá-lo.
Um processo do sistema é identificado exclusivamente no sistema por seu identificador de processo. Como muitos recursos do Windows, um processo também é identificado por seu identificador, que pode não ser exclusivo no computador. Um identificador é o termo genérico para um identificador de um recurso. O sistema operacional persiste o identificador do processo, que é acessado por meio da propriedade Handle do componente Process, mesmo quando o processo foi encerrado. Assim, você pode obter informações administrativas do processo, como o ExitCode (geralmente zero para o sucesso ou um código de erro diferente de zero) e o ExitTime. As alças são um recurso extremamente valioso, portanto, vazar alças é mais virulento do que vazar memória.
Essa classe contém uma demanda de link e uma demanda de herança no nível de classe que se aplica a todos os membros. Uma SecurityException é lançada quando o chamador imediato ou a classe derivada não tem permissão de confiança total. Para detalhes sobre demandas de segurança, consulte Demandas de link.
No. NET Framework na área de trabalho, a classe Process usa, por padrão, codificações de console, que normalmente são codificações de página de código, para os fluxos de entrada, saída e erro. Por exemplo, em sistemas cuja cultura é o inglês (Estados Unidos), a página de códigos 437 é a codificação padrão para a classe Console. No entanto, o. NET Core pode disponibilizar apenas um subconjunto limitado dessas codificações. Se este for o caso, ele usa Encoding. UTF8 como a codificação padrão.
Se um objeto Processar depender de codificações de páginas de código específicas, você ainda poderá disponibilizá-las fazendo o seguinte antes de chamar qualquer método Process:
Adicione uma referência ao assembly System. Text. Encoding. CodePages. dll ao seu projeto.
Passe o objeto EncodingProvider para a codificação. Método RegisterProvider para disponibilizar as codificações adicionais suportadas pelo provedor de codificação.
A classe Process usará automaticamente a codificação padrão do sistema em vez de UTF8, desde que você tenha registrado o provedor de codificação antes de chamar qualquer método Process.

Pesquisa nos EUA na Web para dispositivos móveis.
Bem-vindo ao fórum do Yahoo Search! Gostaríamos de ouvir suas ideias sobre como melhorar a Pesquisa do Yahoo.
O fórum de comentários do produto do Yahoo agora exige um ID e uma senha válidos do Yahoo para participar.
Agora você precisa fazer login usando sua conta de e-mail do Yahoo para nos fornecer feedback e enviar votos e comentários para as ideias existentes. Se você não tiver um ID do Yahoo ou a senha do seu ID do Yahoo, inscreva-se para obter uma nova conta.
Se você tiver um ID e uma senha válidos do Yahoo, siga estas etapas se quiser remover suas postagens, comentários, votos e / ou perfil do fórum de comentários do produto do Yahoo.
Vote em uma ideia existente () ou publique uma nova ideia…
Idéias quentes Idéias superiores Novas ideias Categoria Status Meu feedback.
Melhore seus serviços.
O seu mecanismo de pesquisa não encontra resultados satisfatórios para pesquisas. Está muito fraco. Além disso, o servidor do bing geralmente está desligado.
Rastreador de handicap de golfe, por que não posso chegar a ele?
Por que eu sou redirecionado para o PC e para o dispositivo móvel?
Eu criei uma conta de e-mail / e-mail há muito tempo, mas perdi o acesso a ela; Todos vocês podem excluir todas as minhas contas do Yahoo / Yahoo, exceto a minha mais nova YaAccount.
Eu quero todo o meu acesso perdido yahoo conta 'delete'; Solicitando suporte para exclusão de conta antiga; 'exceto' minha conta do Yahoo mais recente esta conta não excluir! Porque eu não quero que isso interfira com o meu 'jogo' on-line / jogos / negócios / dados / Atividade, porque o programa de computador / segurança pode 'roubar' minhas informações e detectar outras contas; em seguida, proteger as atividades on-line / negócios protegendo da minha suspeita por causa da minha outra conta existente fará com que o programa de segurança seja 'Suspeito' até que eu esteja 'seguro'; e se eu estou jogando online 'Depositando' então eu preciso dessas contas 'delete' porque a insegurança 'Suspicioun' irá programar o jogo de cassino 'Programas' títulos 'para ser' seguro 'então será' injusto 'jogo e eu vai perder por causa da insegurança pode ser uma "desculpa". Espero que vocês entendam minha explicação!
Eu quero todo o meu acesso perdido yahoo conta 'delete'; Solicitando suporte para exclusão de conta antiga; 'exceto' minha conta do Yahoo mais recente esta conta não excluir! Porque eu não quero que isso interfira com o meu 'jogo' on-line / jogos / negócios / dados / Atividade, porque o programa de computador / segurança pode 'roubar' minhas informações e detectar outras contas; em seguida, proteger as atividades on-line / negócios protegendo da minha suspeita por causa da minha outra conta existente fará com que o programa de segurança seja 'Suspeito' até que eu esteja 'seguro'; e se eu estou jogando on-line 'Depositando' então eu preciso dessas contas 'delete' porque a insegurança 'Suspicioun' irá programar o jogo de cassino 'Programas' títulos 'para ser ... mais.

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 Processo 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 encerrar o processo associado pode 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.

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

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