Diagnósticos do sistema processstartinfo waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
Como usar Process. WaitForExit.
Estou chamando um aplicativo da 3ª parte que "às vezes" funciona no VB (é um WCF autônomo). Mas às vezes o aplicativo de terceiros pendura para sempre, então adicionei um temporizador de 90 segundos. O problema é, como eu sei se o tempo expirou?
O código parece assim:
O que eu gostaria de fazer é algo assim.
Verifique o valor de retorno do método - msdn. microsoft/en-us/library/ty0d8k56.aspx - se a chamada expirar, ele retornará False.
Houve problemas conhecidos no passado em que os aplicativos congelariam ao usar WaitForExit.
o registro de walter.
. Escrevendo enquanto aprende.
Sexta-feira, 18 de novembro de 2018.
Process. WaitForExit (Int32) bloqueia o problema.
Como você pode ver, o código inicia um processo "cmd. exe" e passa para ele o comando que eu quero ser executado.
No código eu usei o comando ping - t 8.8.8.8 que, por causa da opção - t, pings o host sem parar. O que acontece? O processo "cmd. exe" juntamente com o comando ping - t nunca sai e nunca fecha o fluxo de stdout e, portanto, o nosso código trava no Output = process. StandardOutput. ReadToEnd (); linha, porque não pode ter sucesso em ler todo o fluxo.
O mesmo acontece também se um comando em um arquivo em lotes trava por qualquer motivo e, portanto, o código acima pode funcionar continuamente por anos e, em seguida, pendure de repente sem nenhum motivo aparente.
você pode enfrentar um impasse se o comando que você atribui a "cmd. exe" ou o processo que você está chamando preenche a saída padrão ou erro padrão. Isso porque nosso código não pode alcançar as linhas.
Na verdade, o processo filho (o comando ping ou um arquivo em lote ou o processo que estiver executando) não pode continuar se o nosso programa não ler os buffers preenchidos dos fluxos e isso não pode acontecer porque o código está pendurado na linha com o processo. WaitForExit () que aguardará para sempre que o projeto filho saia.
O tamanho padrão de ambos os fluxos é de 4096 bytes. Você pode testar esses dois tamanhos com esses arquivos em lote:
Diagnósticos do sistema processstartinfo waitforexit
Resumo Especifica um conjunto de valores usados ao iniciar um processo. Sintaxe C #
Você pode usar a classe ProcessStartInfo para obter maior controle sobre o processo que você inicia. Você deve, pelo menos, definir a propriedade ProcessStartInfo. FileName, manualmente ou usando o construtor. O nome do arquivo é qualquer aplicativo ou documento. Aqui, um documento é definido como qualquer tipo de arquivo que tenha uma ação aberta ou padrão associada a ele. Você pode ver os tipos de arquivos registrados e seus aplicativos associados para o seu computador usando a caixa de diálogo Opções de pasta disponível no sistema operacional. O botão Avançado leva a uma caixa de diálogo que mostra se existe uma ação aberta associada a um tipo de arquivo registrado específico.
Além disso, você pode definir outras propriedades que definem as ações a serem realizadas com esse arquivo. Você pode especificar um valor específico para o tipo de propriedade ProcessStartInfo. FileName para a propriedade System. Diagnostics. ProcessStartInfo. Verb (não suportado na fonte CLI compartilhada). Por exemplo, você pode especificar "imprimir" para um tipo de documento. Além disso, você pode especificar os valores da propriedade ProcessStartInfo. Arguments para serem argumentos de linha de comando para passar ao procedimento aberto do arquivo. Por exemplo, se você especificar um aplicativo de editor de texto na propriedade ProcessStartInfo. FileName, você pode usar a propriedade ProcessStartInfo. Arguments para especificar um arquivo de texto a ser aberto pelo editor.
A entrada padrão geralmente é o teclado, e a saída padrão e o erro geralmente são a tela do monitor. No entanto, você pode usar as propriedades ProcessStartInfo. RedirectStandardInput, ProcessStartInfo. RedirectStandardOutput e ProcessStartInfo. RedirectStandardError para fazer com que o processo obtenha entrada ou retorne a saída para um arquivo ou outro dispositivo. Se você usar as propriedades Process. StandardInput, Process. StandardOutput ou Process. StandardError no componente Process, você deve primeiro definir o valor correspondente na propriedade ProcessStartInfo. Caso contrário, o sistema lança uma exceção quando você lê ou escreve no fluxo.
Defina ProcessStartInfo. UseShellExecute para especificar se deseja iniciar o processo usando o shell do sistema operacional.
Você pode alterar o valor de qualquer propriedade ProcessStartInfo até o momento em que o processo for iniciado. Depois de iniciar o processo, alterar esses valores não tem efeito.
System. Diagnostics. ProcessStartInfo Lista de membros:
Inicializa uma nova instância da classe ProcessStartInfo sem especificar um nome de arquivo com o qual iniciar o processo.
.ctor (string fileName, argumentos de cadeia)
(herdado de System. Object)
(herdado de System. Object)
(herdado de System. Object)
(herdado de System. Object)
(herdado de System. Object)
(herdado de System. Object)
System. Diagnostics. ProcessStartInfo Detalhes do Membro.
Construtor padrão. Esse construtor é chamado por construtores de classes derivadas para inicializar o estado desse tipo. Sintaxe C #
Opcionalmente, você também pode definir outras propriedades antes de iniciar o processo. A propriedade System. Diagnostics. ProcessStartInfo. Verb (não suportado na fonte CLI compartilhada) fornece ações a serem realizadas, como "imprimir", com o arquivo indicado na propriedade ProcessStartInfo. FileName. A propriedade ProcessStartInfo. Arguments fornece uma maneira de passar os argumentos da linha de comando para o arquivo quando o sistema o abrir.
Retornar ao topo.
Um aplicativo ou documento com o qual iniciar um processo.
Comentários O nome do arquivo é qualquer aplicativo ou documento. Neste caso, um documento é definido como qualquer tipo de arquivo que tenha uma ação aberta ou padrão associada a ele. Você pode ver os tipos de arquivos registrados e seus aplicativos associados para o seu computador usando a caixa de diálogo Opções de pasta disponível no sistema operacional. O botão Avançado leva a uma caixa de diálogo que mostra se existe uma ação aberta associada a um tipo de arquivo registrado específico.
Você pode alterar a propriedade ProcessStartInfo. FileName depois de chamar esse construtor, até o momento em que o processo for iniciado. Depois de iniciar o processo, alterar esses valores não tem efeito.
Retornar ao topo.
Um aplicativo com o qual iniciar um processo.
Argumentos da linha de comando para passar para o aplicativo quando o processo for iniciado.
Comentários O nome do arquivo é qualquer aplicativo ou documento. Neste caso, um documento é definido como qualquer tipo de arquivo que tenha uma ação aberta ou padrão associada a ele. Você pode ver os tipos de arquivos registrados e seus aplicativos associados para o seu computador usando a caixa de diálogo Opções de pasta disponível no sistema operacional. O botão Avançado leva a uma caixa de diálogo que mostra se existe uma ação aberta associada a um tipo de arquivo registrado específico.
Você pode alterar as propriedades ProcessStartInfo. FileName ou ProcessStartInfo. Arguments depois de chamar este construtor, até o momento em que o processo é iniciado. Depois de iniciar o processo, alterar esses valores não tem efeito.
Retornar ao topo.
Sumário Gest ou define o conjunto de argumentos de linha de comando para usar ao iniciar o aplicativo. Sintaxe C #
Retornar ao topo.
Resumo Obtém os caminhos de pesquisa para arquivos, diretórios para arquivos temporários, opções específicas de aplicativos e outras informações semelhantes. Sintaxe C #
Retornar ao topo.
Retornar ao topo.
Resumo Obtém ou define um valor indicando se a saída de erro do processo foi gravada no membro Process. StandardError da instância Processo, permitindo que você escreva para um destino diferente do fluxo de erro padrão (geralmente a tela do monitor). Usado para escrever dados de erro em um arquivo ou log, por exemplo. Sintaxe C #
Nessa instância, ambos os processos pai e filho seriam bloqueados, pois o tubo preenchido impede que o processo filho seja concluído, enquanto o processo pai espera indefinidamente para que o processo filho saia.
Esse problema pode ser resolvido movendo o ReadToEnd () antes do WaitForExit (), da seguinte forma.
Um problema semelhante surge se você redirecionar saída padrão e erro padrão e tente ler ambos, por exemplo, usando o seguinte código C #.
Nesse caso, se o processo filho escrever qualquer texto para erro padrão, ele bloqueará o processo, porque o processo pai não pode ler de erro padrão até que ele tenha terminado a leitura da saída padrão. No entanto, o processo pai não será lido a partir da saída padrão até o processo terminar. Uma solução recomendada para esta situação é criar dois tópicos para que seu aplicativo possa ler a saída de cada fluxo em um segmento separado.
Retornar ao topo.
Resumo Obtém ou define um valor que indica se a entrada do comando do processo é lida do membro Process. StandardInput da instância do Processo, permitindo que você leia uma fonte diferente do fluxo de entrada padrão (geralmente o teclado). Usado para ler dados de um arquivo, por exemplo. Sintaxe C #
Retornar ao topo.
Resumo Obtém ou define um valor que indica se a saída do processo é gravada no membro Process. StandardOutput da instância do Processo, permitindo que você escreva para um destino diferente do fluxo de saída padrão (geralmente a tela do monitor). Usado para escrever dados em um arquivo, por exemplo. Sintaxe C #
Nessa instância, ambos os processos pai e filho seriam bloqueados, pois o tubo preenchido impede que o processo filho seja concluído, enquanto o processo pai espera indefinidamente para que o processo filho saia.
Esse problema pode ser resolvido movendo o ReadToEnd () antes do WaitForExit (), da seguinte forma.
Um problema semelhante surge se você redirecionar saída padrão e erro padrão e tente ler ambos, por exemplo, usando o seguinte código C #.
Nesse caso, se o processo filho escrever qualquer texto para erro padrão, ele bloqueará o processo, porque o processo pai não pode ler de erro padrão até que ele tenha terminado a leitura da saída padrão. No entanto, o processo pai não será lido a partir da saída padrão até o processo terminar. Uma solução recomendada para esta situação é criar dois tópicos para que seu aplicativo possa ler a saída de cada fluxo em um segmento separado.
Retornar ao topo.
Resumo Obtém ou define um valor indicando se deve usar o shell do sistema operacional para iniciar o processo. Sintaxe C #
Quando você usa o shell do sistema operacional para iniciar processos, você pode iniciar qualquer documento (que é qualquer tipo de arquivo registrado associado a um executável que tenha uma ação aberta padrão) e executar operações no arquivo, como impressão, com o Processo componente. Quando ProcessStartInfo. UseShellExecute é falso, você pode iniciar apenas executáveis com o componente Processo.
Retornar ao topo.
Resumo Obtém ou define o diretório inicial para o processo ser iniciado. Sintaxe C #
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.
Processo . Método WaitForExit.
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.
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. Para evitar o bloqueio do segmento atual, use o evento Exitado.
Para exemplos de código, consulte as páginas de referência da propriedade StandardError e ExitCode.
Assembly: System (no System. dll)
Instrui o componente Processo a esperar indefinidamente para que o processo associado saia.
Instrui o componente Processo a aguardar o número especificado de milissegundos para que o processo associado saia.
Resumo Especifica um conjunto de valores usados ao iniciar um processo. Sintaxe C #
Você pode usar a classe ProcessStartInfo para obter maior controle sobre o processo que você inicia. Você deve, pelo menos, definir a propriedade ProcessStartInfo. FileName, manualmente ou usando o construtor. O nome do arquivo é qualquer aplicativo ou documento. Aqui, um documento é definido como qualquer tipo de arquivo que tenha uma ação aberta ou padrão associada a ele. Você pode ver os tipos de arquivos registrados e seus aplicativos associados para o seu computador usando a caixa de diálogo Opções de pasta disponível no sistema operacional. O botão Avançado leva a uma caixa de diálogo que mostra se existe uma ação aberta associada a um tipo de arquivo registrado específico.
Além disso, você pode definir outras propriedades que definem as ações a serem realizadas com esse arquivo. Você pode especificar um valor específico para o tipo de propriedade ProcessStartInfo. FileName para a propriedade System. Diagnostics. ProcessStartInfo. Verb (não suportado na fonte CLI compartilhada). Por exemplo, você pode especificar "imprimir" para um tipo de documento. Além disso, você pode especificar os valores da propriedade ProcessStartInfo. Arguments para serem argumentos de linha de comando para passar ao procedimento aberto do arquivo. Por exemplo, se você especificar um aplicativo de editor de texto na propriedade ProcessStartInfo. FileName, você pode usar a propriedade ProcessStartInfo. Arguments para especificar um arquivo de texto a ser aberto pelo editor.
A entrada padrão geralmente é o teclado, e a saída padrão e o erro geralmente são a tela do monitor. No entanto, você pode usar as propriedades ProcessStartInfo. RedirectStandardInput, ProcessStartInfo. RedirectStandardOutput e ProcessStartInfo. RedirectStandardError para fazer com que o processo obtenha entrada ou retorne a saída para um arquivo ou outro dispositivo. Se você usar as propriedades Process. StandardInput, Process. StandardOutput ou Process. StandardError no componente Process, você deve primeiro definir o valor correspondente na propriedade ProcessStartInfo. Caso contrário, o sistema lança uma exceção quando você lê ou escreve no fluxo.
Defina ProcessStartInfo. UseShellExecute para especificar se deseja iniciar o processo usando o shell do sistema operacional.
Você pode alterar o valor de qualquer propriedade ProcessStartInfo até o momento em que o processo for iniciado. Depois de iniciar o processo, alterar esses valores não tem efeito.
System. Diagnostics. ProcessStartInfo Lista de membros:
Inicializa uma nova instância da classe ProcessStartInfo sem especificar um nome de arquivo com o qual iniciar o processo.
.ctor (string fileName, argumentos de cadeia)
(herdado de System. Object)
(herdado de System. Object)
(herdado de System. Object)
(herdado de System. Object)
(herdado de System. Object)
(herdado de System. Object)
System. Diagnostics. ProcessStartInfo Detalhes do Membro.
Construtor padrão. Esse construtor é chamado por construtores de classes derivadas para inicializar o estado desse tipo. Sintaxe C #
Opcionalmente, você também pode definir outras propriedades antes de iniciar o processo. A propriedade System. Diagnostics. ProcessStartInfo. Verb (não suportado na fonte CLI compartilhada) fornece ações a serem realizadas, como "imprimir", com o arquivo indicado na propriedade ProcessStartInfo. FileName. A propriedade ProcessStartInfo. Arguments fornece uma maneira de passar os argumentos da linha de comando para o arquivo quando o sistema o abrir.
Retornar ao topo.
Um aplicativo ou documento com o qual iniciar um processo.
Comentários O nome do arquivo é qualquer aplicativo ou documento. Neste caso, um documento é definido como qualquer tipo de arquivo que tenha uma ação aberta ou padrão associada a ele. Você pode ver os tipos de arquivos registrados e seus aplicativos associados para o seu computador usando a caixa de diálogo Opções de pasta disponível no sistema operacional. O botão Avançado leva a uma caixa de diálogo que mostra se existe uma ação aberta associada a um tipo de arquivo registrado específico.
Você pode alterar a propriedade ProcessStartInfo. FileName depois de chamar esse construtor, até o momento em que o processo for iniciado. Depois de iniciar o processo, alterar esses valores não tem efeito.
Retornar ao topo.
Um aplicativo com o qual iniciar um processo.
Argumentos da linha de comando para passar para o aplicativo quando o processo for iniciado.
Comentários O nome do arquivo é qualquer aplicativo ou documento. Neste caso, um documento é definido como qualquer tipo de arquivo que tenha uma ação aberta ou padrão associada a ele. Você pode ver os tipos de arquivos registrados e seus aplicativos associados para o seu computador usando a caixa de diálogo Opções de pasta disponível no sistema operacional. O botão Avançado leva a uma caixa de diálogo que mostra se existe uma ação aberta associada a um tipo de arquivo registrado específico.
Você pode alterar as propriedades ProcessStartInfo. FileName ou ProcessStartInfo. Arguments depois de chamar este construtor, até o momento em que o processo é iniciado. Depois de iniciar o processo, alterar esses valores não tem efeito.
Retornar ao topo.
Sumário Gest ou define o conjunto de argumentos de linha de comando para usar ao iniciar o aplicativo. Sintaxe C #
Retornar ao topo.
Resumo Obtém os caminhos de pesquisa para arquivos, diretórios para arquivos temporários, opções específicas de aplicativos e outras informações semelhantes. Sintaxe C #
Retornar ao topo.
Retornar ao topo.
Resumo Obtém ou define um valor indicando se a saída de erro do processo foi gravada no membro Process. StandardError da instância Processo, permitindo que você escreva para um destino diferente do fluxo de erro padrão (geralmente a tela do monitor). Usado para escrever dados de erro em um arquivo ou log, por exemplo. Sintaxe C #
Nessa instância, ambos os processos pai e filho seriam bloqueados, pois o tubo preenchido impede que o processo filho seja concluído, enquanto o processo pai espera indefinidamente para que o processo filho saia.
Esse problema pode ser resolvido movendo o ReadToEnd () antes do WaitForExit (), da seguinte forma.
Um problema semelhante surge se você redirecionar saída padrão e erro padrão e tente ler ambos, por exemplo, usando o seguinte código C #.
Nesse caso, se o processo filho escrever qualquer texto para erro padrão, ele bloqueará o processo, porque o processo pai não pode ler de erro padrão até que ele tenha terminado a leitura da saída padrão. No entanto, o processo pai não será lido a partir da saída padrão até o processo terminar. Uma solução recomendada para esta situação é criar dois tópicos para que seu aplicativo possa ler a saída de cada fluxo em um segmento separado.
Retornar ao topo.
Resumo Obtém ou define um valor que indica se a entrada do comando do processo é lida do membro Process. StandardInput da instância do Processo, permitindo que você leia uma fonte diferente do fluxo de entrada padrão (geralmente o teclado). Usado para ler dados de um arquivo, por exemplo. Sintaxe C #
Retornar ao topo.
Resumo Obtém ou define um valor que indica se a saída do processo é gravada no membro Process. StandardOutput da instância do Processo, permitindo que você escreva para um destino diferente do fluxo de saída padrão (geralmente a tela do monitor). Usado para escrever dados em um arquivo, por exemplo. Sintaxe C #
Nessa instância, ambos os processos pai e filho seriam bloqueados, pois o tubo preenchido impede que o processo filho seja concluído, enquanto o processo pai espera indefinidamente para que o processo filho saia.
Esse problema pode ser resolvido movendo o ReadToEnd () antes do WaitForExit (), da seguinte forma.
Um problema semelhante surge se você redirecionar saída padrão e erro padrão e tente ler ambos, por exemplo, usando o seguinte código C #.
Nesse caso, se o processo filho escrever qualquer texto para erro padrão, ele bloqueará o processo, porque o processo pai não pode ler de erro padrão até que ele tenha terminado a leitura da saída padrão. No entanto, o processo pai não será lido a partir da saída padrão até o processo terminar. Uma solução recomendada para esta situação é criar dois tópicos para que seu aplicativo possa ler a saída de cada fluxo em um segmento separado.
Retornar ao topo.
Resumo Obtém ou define um valor indicando se deve usar o shell do sistema operacional para iniciar o processo. Sintaxe C #
Quando você usa o shell do sistema operacional para iniciar processos, você pode iniciar qualquer documento (que é qualquer tipo de arquivo registrado associado a um executável que tenha uma ação aberta padrão) e executar operações no arquivo, como impressão, com o Processo componente. Quando ProcessStartInfo. UseShellExecute é falso, você pode iniciar apenas executáveis com o componente Processo.
Retornar ao topo.
Resumo Obtém ou define o diretório inicial para o processo ser iniciado. Sintaxe C #
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.
Processo . Método WaitForExit.
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.
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. Para evitar o bloqueio do segmento atual, use o evento Exitado.
Para exemplos de código, consulte as páginas de referência da propriedade StandardError e ExitCode.
Assembly: System (no System. dll)
Instrui o componente Processo a esperar indefinidamente para que o processo associado saia.
Instrui o componente Processo a aguardar o número especificado de milissegundos para que o processo associado saia.
No comments:
Post a Comment