Waitforexit c # trava
Obter através da App Store Leia esta publicação em nosso aplicativo!
Process. WaitForExit (Int32)
No momento, estou trabalhando em um aplicativo Console Runner que possui o seguinte código para gerar o log e aguardar até que o processo seja concluído:
Eu tenho duas perguntas sobre esse pedaço de código.
Percebi que se o processo demorar mais de 30 segundos, a chamada p. ExitCode bombardeia. O que acontece se o meu processo demorar apenas 1 segundo, ele irá esperar 30 segundos de qualquer maneira ou o processo será avisado pelo CLR?
Se você tentar obter o ExitCode antes do processo ter saído, a tentativa lança uma exceção. Examine a propriedade HasExited primeiro para verificar se o processo associado foi finalizado.
Não há garantia de que, quando sua chamada para WaitForExit retornar, o processo será encerrado. Da documentação de WaitForExit:
A sobrecarga WaitForExit (Int32) é usada para fazer o segmento atual aguardar até que o processo associado seja finalizado. Essa sobrecarga instrui o componente Processo a aguardar uma quantidade limitada de tempo para que o processo saia. 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 (Infinito) por milissegundos e Process. WaitForExit (Int32) se comportará da mesma maneira que a sobrecarga WaitForExit (). 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.
Observe que isso responde sua segunda pergunta. Se o processo for encerrado antes do tempo decorrido, o WaitForExit retornará.
Como você especificou um tempo limite finito, você permite a possibilidade de a função retornar antes do processo ter terminado. Então, você poderia escrever seu código como este:
Waitforexit c # trava
Obter através da App Store Leia esta publicação em nosso aplicativo!
Processo suspenso quando executado com Process. Start - o que está errado?
Eu escrevi um wrapper rápido e sujo em torno de svn. exe para recuperar algum conteúdo e fazer algo com ele, mas para determinadas entradas ocasionalmente e reproduzivelmente trava e não irá terminar. Por exemplo, uma chamada é para a lista svn:
Esta linha de comando é executada corretamente quando eu apenas faço isso a partir de um shell de comando, mas ele trava no meu aplicativo. Meu código c # para executar isso é:
Isso leva 5000 ms e nunca termina. A extensão do tempo não ajuda. Em um prompt de comando separado, ele é executado instantaneamente, então eu tenho certeza de que não está relacionado com um tempo de espera insuficiente. Para outras entradas, no entanto, isso parece funcionar bem.
Eu também tentei executar um cmd. exe separado aqui (onde exe é svn. exe e args é a string arg original), mas o bloqueio ainda ocorreu:
O que eu poderia esvaziar aqui, e como posso depurar esse processo externo?
Agora estou começando a abordar isso. Mucho obrigado a Jon Skeet por sua sugestão, o que realmente funciona muito bem. Eu tenho outra pergunta sobre o meu método de lidar com isso, porém, desde que eu sou um novato multi-threaded. Eu gostaria de sugestões sobre como melhorar as deficiências flagrantes ou qualquer coisa de outra forma estranha. Acabei criando uma classe pequena que contenha o fluxo de stdout, um StringBuilder para manter a saída, e uma bandeira para contar quando terminar. Então usei ThreadPool. QueueUserWorkItem e passei em uma instância da minha classe:
Isso parece funcionar, mas duvido que esta seja a melhor maneira. Isso é razoável? E o que posso fazer para melhorar isso?
Um problema padrão: o processo pode estar esperando que você leia sua saída. Crie um segmento separado para ler a partir de sua saída padrão enquanto espera que ele saia. É um pouco de dor, mas isso pode muito bem ser o problema.
Jon Skeet está certo no dinheiro!
Eu sei que meus reposs do SVN podem funcionar lentamente às vezes, então talvez 5 segundos não sejam suficientemente longos? Você copiou a string que está passando para o processo a partir de um ponto de interrupção para que você seja positivo, não está alertando para nada?
Eu sei que este é um post antigo, mas talvez isso ajude alguém. Eu usei isso para executar alguns comandos CLI da AWS (Serviços Web da Amazon) usando tarefas TPL.
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.
Instrui o componente Processo a esperar indefinidamente para que o processo associado saia.
Assembly: System (no System. dll)
A configuração de espera não pôde ser acessada.
Nenhum Id do processo foi configurado e um identificador do qual a propriedade Id pode ser determinada não existe.
Não existe nenhum processo associado a este objeto Processo.
Você está tentando chamar WaitForExit () para um processo que está sendo executado em um computador remoto. Este método está disponível somente para processos que estão sendo executados no computador local.
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.
Esse método instrui o componente Processo a 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 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 no loop de mensagem.
No Quadro 3.5 e versões anteriores, a sobrecarga WaitForExit () esperava milissegundos MaxValue (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 MaxValue completo 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 WaitForExit (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 um término normal ou anormal), o sistema armazena informações administrativas sobre o processo e retorna ao componente que chamou WaitForExit (). O componente Processo pode acessar a informação, que inclui o ExitTime, usando o Handle para o processo encerrado.
Como o processo associado saiu, a propriedade Handle do componente já não 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 manipulações para processos que não foram lançados pelos componentes do Processo, portanto, mantém as informações ExitTime e Handle na memória até que o componente Processo liberte especificamente os recursos. Por esse motivo, sempre que você ligar para uma instância do Start for Process, chame Close quando o processo associado for encerrado e você não precisa mais de informações administrativas sobre isso. Close libera a memória alocada para o processo finalizado.
Consulte a seção Comentários da página de referência da propriedade StandardError.
para 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.
Waitforexit c # trava
Eu tenho o seguinte código na minha aplicação:
System. Diagnostics. Process proc = new System. Diagnostics. Process ();
Uma vez que eu chamo isso através de outra aplicação, o processo está pendurado.
Então eu dei um tempo de 5 segundos e agora funciona bem. Mas eu preciso encontrar uma maneira melhor de resolver esse problema, pois esse valor de tempo limite pode depender dos recursos do sistema e a quantidade de aplicativo de entrada deve ser processada.
Então, minha pergunta é se estamos criando um processo usando o System. Diagnostics, o sistema operacional cria um segmento separado e o faz como fio primário ou UI thread?
Ou está criando um fio CLR que é o mesmo que System. Threading. Thread?
Se usarmos Thread-pool para criar uma thread de trabalho, seria uma opção melhor?
O pool de threads usa o modo de programação do usuário?
Aprecie sua ajuda nisso.
Eu preciso saber disso, porque se o System. Diagnostics também criar um thread de fundo ou thread de trabalho, nenhum ponto criando um thread separado novamente, pois não haverá nenhuma alteração no final do dia.
Qual a diferença entre a implementação acima sobre a criação de uma linha de fundo?
Você está confundindo os tópicos internos e externos ao seu aplicativo. Se você usa WaitForExit no seu segmento UI. Isso bloqueará o segmento UI tornando-o insensível. Se isso é um problema, genere o novo processo no evento DoWork de um BackgroundWorker. Quando o processo for encerrado, o RunWorkerCompleteEvent será ativado, alertando seu segmento UI.
Marcado como resposta por Min Zhu pessoal contingente da Microsoft, Moderador segunda-feira, 18 de julho de 2011 3:10 AM.
Todas as respostas.
Esperando um evento com EnableRaisingEvents = false significa que você está usando WaitForExit como um temporizador. Defina-o para um valor apropriado.
Esperando um evento com EnableRaisingEvents = false significa que você está usando WaitForExit como um temporizador. Defina-o para um valor apropriado.
Eu atribuí 5000 como o valor e corrigiu o problema. Minha preocupação é que funcionará de forma semelhante em diferentes recursos do sistema, tamanho de conteúdo de entrada etc.?
O que acontecerá se o processo associado não sair ao final do intervalo?
O Windows não é um sistema operacional em tempo real, então qualquer temporizador dependerá do agendamento do sistema operacional. Supostamente, o System. Timers. Timer é o mais preciso.
& quot; o que acontecerá se o processo associado não sair ao final do intervalo? & quot; Você desativou esse recurso. Se é isso que você está tentando fazer, habilite-o. Se você não deseja bloquear o segmento que você usou para iniciar o processo, inicie-o a partir de um segmento de fundo. O BackgxroundWorker seria apropriado para isso.
Eu preciso saber disso, porque se o System. Diagnostics também criar um thread de fundo ou thread de trabalho, nenhum ponto criando um thread separado novamente, pois não haverá nenhuma alteração no final do dia.
Qual a diferença entre a implementação acima sobre a criação de uma linha de fundo?
Eu preciso saber disso, porque se o System. Diagnostics também criar um thread de fundo ou thread de trabalho, nenhum ponto criando um thread separado novamente, pois não haverá nenhuma alteração no final do dia.
Qual a diferença entre a implementação acima sobre a criação de uma linha de fundo?
Você está confundindo os tópicos internos e externos ao seu aplicativo. Se você usa WaitForExit no seu segmento UI. Isso bloqueará o segmento UI tornando-o insensível. Se isso é um problema, genere o novo processo no evento DoWork de um BackgroundWorker. Quando o processo for encerrado, o RunWorkerCompleteEvent será ativado, alertando seu segmento UI.
Marcado como resposta por Min Zhu pessoal contingente da Microsoft, Moderador segunda-feira, 18 de julho de 2011 3:10 AM.
A Microsoft está conduzindo uma pesquisa on-line para entender sua opinião sobre o site da Msdn. Se você optar por participar, a pesquisa on-line será apresentada quando você sair do site do Msdn.
Waitforexit c # trava
Eu procurei tópicos diferentes sobre isso, mas todos usam o Process. RedirectStandardOutput = True, o que eu não.
Estou tentando abrir um processo (aplicativo de console, não feito por mim) para compilar um arquivo. acs especial para um arquivo. o. A estrutura é simples, o único argumento é o arquivo que você deseja compilar.
Mas em determinados arquivos meu aplicativo trava ao tentar abrir o processo. Aqui está o meu código:
Para iniciar o processo eu uso praticamente o mesmo código que outro cara fez em C #. E seu código está funcionando perfeitamente.
Espero que seu dia tenha sido melhor do que ontem, mas que é pior do que amanhã.
Marque como resposta se resolvi seu problema. :)
Editado por Visual Vincent sábado, 3 de janeiro de 2015 14:57.
Você comparou FileNames e Argumentos dos que trabalham e aqueles que não são? Existe alguma diferença neles, como as que funcionam, não contêm espaços em branco no FileName ou argumentos e os que trabalham não contêm espaços em branco neles? Se você achar que é o problema, então você precisa adicionar Cotações para o início e fim do FileName ou Argumentos.
Meu primeiro palpite é que os Argumentos precisam das Cotações assim porque, eu vejo espaços em branco no seu exemplo dos Argumentos.
Se você diz que não pode ser feito, eu vou tentar.
Editado por IronRazerz Sábado, 03 de janeiro de 2015 3:51 PM Marcado como resposta por Visual Vincent Sábado, 03 de janeiro de 2015 4:33 PM.
Todas as respostas.
Você comparou FileNames e Argumentos dos que trabalham e aqueles que não são? Existe alguma diferença neles, como as que funcionam, não contêm espaços em branco no FileName ou argumentos e os que trabalham não contêm espaços em branco neles? Se você achar que é o problema, então você precisa adicionar Cotações para o início e fim do FileName ou Argumentos.
Meu primeiro palpite é que os Argumentos precisam das Cotações assim porque, eu vejo espaços em branco no seu exemplo dos Argumentos.
Se você diz que não pode ser feito, eu vou tentar.
Editado por IronRazerz Sábado, 03 de janeiro de 2015 3:51 PM Marcado como resposta por Visual Vincent Sábado, 03 de janeiro de 2015 4:33 PM.
Você tentou o mesmo comando manualmente em uma janela de console? Talvez pare e aguarde algo. Ou não configure CreateNoWindow, ErrorDialog e WIndowStyle e veja o que acontece.
Editado por Viorel_ MVP sábado, 03 de janeiro de 2015 4:27 PM.
Você comparou FileNames e Argumentos dos que trabalham e aqueles que não são? Existe alguma diferença neles, como as que funcionam, não contêm espaços em branco no FileName ou argumentos e os que trabalham não contêm espaços em branco neles? Se você achar que é o problema, então você precisa adicionar Cotações para o início e fim do FileName ou Argumentos.
Meu primeiro palpite é que os Argumentos precisam das Cotações assim porque, eu vejo espaços em branco no seu exemplo dos Argumentos.
Se você diz que não pode ser feito, eu vou tentar.
Isso realmente aconteceu. Eu tinha esquecido que os espaços em branco tornam um novo argumento, meu bobo. Não uso argumentos de processo que muitas vezes. ;)
Espero que seu dia tenha sido melhor do que ontem, mas que é pior do que amanhã.
Marque como resposta se resolvi seu problema. :)
Editado por Visual Vincent sábado, 03 de janeiro de 2015 4:33 PM.
Você tentou o mesmo comando manualmente em uma janela de console? Talvez pare e aguarde algo. Ou não configure CreateNoWindow, ErrorDialog e WIndowStyle e veja o que acontece.
Fazê-lo da maneira normal (arrastar e soltar, ou fazê-lo via CMD) funciona, sim.
Espero que seu dia tenha sido melhor do que ontem, mas que é pior do que amanhã.
Marque como resposta se resolvi seu problema. :)
Se você diz que não pode ser feito, eu vou tentar.
Editado por IronRazerz sábado, 3 de janeiro de 2015 16:39.
A Microsoft está conduzindo uma pesquisa on-line para entender sua opinião sobre o site da Msdn. Se você optar por participar, a pesquisa on-line será apresentada quando você sair do site do Msdn.
Obter através da App Store Leia esta publicação em nosso aplicativo!
Processo suspenso quando executado com Process. Start - o que está errado?
Eu escrevi um wrapper rápido e sujo em torno de svn. exe para recuperar algum conteúdo e fazer algo com ele, mas para determinadas entradas ocasionalmente e reproduzivelmente trava e não irá terminar. Por exemplo, uma chamada é para a lista svn:
Esta linha de comando é executada corretamente quando eu apenas faço isso a partir de um shell de comando, mas ele trava no meu aplicativo. Meu código c # para executar isso é:
Isso leva 5000 ms e nunca termina. A extensão do tempo não ajuda. Em um prompt de comando separado, ele é executado instantaneamente, então eu tenho certeza de que não está relacionado com um tempo de espera insuficiente. Para outras entradas, no entanto, isso parece funcionar bem.
Eu também tentei executar um cmd. exe separado aqui (onde exe é svn. exe e args é a string arg original), mas o bloqueio ainda ocorreu:
O que eu poderia esvaziar aqui, e como posso depurar esse processo externo?
Agora estou começando a abordar isso. Mucho obrigado a Jon Skeet por sua sugestão, o que realmente funciona muito bem. Eu tenho outra pergunta sobre o meu método de lidar com isso, porém, desde que eu sou um novato multi-threaded. Eu gostaria de sugestões sobre como melhorar as deficiências flagrantes ou qualquer coisa de outra forma estranha. Acabei criando uma classe pequena que contenha o fluxo de stdout, um StringBuilder para manter a saída, e uma bandeira para contar quando terminar. Então usei ThreadPool. QueueUserWorkItem e passei em uma instância da minha classe:
Isso parece funcionar, mas duvido que esta seja a melhor maneira. Isso é razoável? E o que posso fazer para melhorar isso?
Um problema padrão: o processo pode estar esperando que você leia sua saída. Crie um segmento separado para ler a partir de sua saída padrão enquanto espera que ele saia. É um pouco de dor, mas isso pode muito bem ser o problema.
Jon Skeet está certo no dinheiro!
Eu sei que meus reposs do SVN podem funcionar lentamente às vezes, então talvez 5 segundos não sejam suficientemente longos? Você copiou a string que está passando para o processo a partir de um ponto de interrupção para que você seja positivo, não está alertando para nada?
Eu sei que este é um post antigo, mas talvez isso ajude alguém. Eu usei isso para executar alguns comandos CLI da AWS (Serviços Web da Amazon) usando tarefas TPL.
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.
Instrui o componente Processo a esperar indefinidamente para que o processo associado saia.
Assembly: System (no System. dll)
A configuração de espera não pôde ser acessada.
Nenhum Id do processo foi configurado e um identificador do qual a propriedade Id pode ser determinada não existe.
Não existe nenhum processo associado a este objeto Processo.
Você está tentando chamar WaitForExit () para um processo que está sendo executado em um computador remoto. Este método está disponível somente para processos que estão sendo executados no computador local.
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.
Esse método instrui o componente Processo a 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 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 no loop de mensagem.
No Quadro 3.5 e versões anteriores, a sobrecarga WaitForExit () esperava milissegundos MaxValue (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 MaxValue completo 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 WaitForExit (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 um término normal ou anormal), o sistema armazena informações administrativas sobre o processo e retorna ao componente que chamou WaitForExit (). O componente Processo pode acessar a informação, que inclui o ExitTime, usando o Handle para o processo encerrado.
Como o processo associado saiu, a propriedade Handle do componente já não 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 manipulações para processos que não foram lançados pelos componentes do Processo, portanto, mantém as informações ExitTime e Handle na memória até que o componente Processo liberte especificamente os recursos. Por esse motivo, sempre que você ligar para uma instância do Start for Process, chame Close quando o processo associado for encerrado e você não precisa mais de informações administrativas sobre isso. Close libera a memória alocada para o processo finalizado.
Consulte a seção Comentários da página de referência da propriedade StandardError.
para 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.
Waitforexit c # trava
Eu tenho o seguinte código na minha aplicação:
System. Diagnostics. Process proc = new System. Diagnostics. Process ();
Uma vez que eu chamo isso através de outra aplicação, o processo está pendurado.
Então eu dei um tempo de 5 segundos e agora funciona bem. Mas eu preciso encontrar uma maneira melhor de resolver esse problema, pois esse valor de tempo limite pode depender dos recursos do sistema e a quantidade de aplicativo de entrada deve ser processada.
Então, minha pergunta é se estamos criando um processo usando o System. Diagnostics, o sistema operacional cria um segmento separado e o faz como fio primário ou UI thread?
Ou está criando um fio CLR que é o mesmo que System. Threading. Thread?
Se usarmos Thread-pool para criar uma thread de trabalho, seria uma opção melhor?
O pool de threads usa o modo de programação do usuário?
Aprecie sua ajuda nisso.
Eu preciso saber disso, porque se o System. Diagnostics também criar um thread de fundo ou thread de trabalho, nenhum ponto criando um thread separado novamente, pois não haverá nenhuma alteração no final do dia.
Qual a diferença entre a implementação acima sobre a criação de uma linha de fundo?
Você está confundindo os tópicos internos e externos ao seu aplicativo. Se você usa WaitForExit no seu segmento UI. Isso bloqueará o segmento UI tornando-o insensível. Se isso é um problema, genere o novo processo no evento DoWork de um BackgroundWorker. Quando o processo for encerrado, o RunWorkerCompleteEvent será ativado, alertando seu segmento UI.
Marcado como resposta por Min Zhu pessoal contingente da Microsoft, Moderador segunda-feira, 18 de julho de 2011 3:10 AM.
Todas as respostas.
Esperando um evento com EnableRaisingEvents = false significa que você está usando WaitForExit como um temporizador. Defina-o para um valor apropriado.
Esperando um evento com EnableRaisingEvents = false significa que você está usando WaitForExit como um temporizador. Defina-o para um valor apropriado.
Eu atribuí 5000 como o valor e corrigiu o problema. Minha preocupação é que funcionará de forma semelhante em diferentes recursos do sistema, tamanho de conteúdo de entrada etc.?
O que acontecerá se o processo associado não sair ao final do intervalo?
O Windows não é um sistema operacional em tempo real, então qualquer temporizador dependerá do agendamento do sistema operacional. Supostamente, o System. Timers. Timer é o mais preciso.
& quot; o que acontecerá se o processo associado não sair ao final do intervalo? & quot; Você desativou esse recurso. Se é isso que você está tentando fazer, habilite-o. Se você não deseja bloquear o segmento que você usou para iniciar o processo, inicie-o a partir de um segmento de fundo. O BackgxroundWorker seria apropriado para isso.
Eu preciso saber disso, porque se o System. Diagnostics também criar um thread de fundo ou thread de trabalho, nenhum ponto criando um thread separado novamente, pois não haverá nenhuma alteração no final do dia.
Qual a diferença entre a implementação acima sobre a criação de uma linha de fundo?
Eu preciso saber disso, porque se o System. Diagnostics também criar um thread de fundo ou thread de trabalho, nenhum ponto criando um thread separado novamente, pois não haverá nenhuma alteração no final do dia.
Qual a diferença entre a implementação acima sobre a criação de uma linha de fundo?
Você está confundindo os tópicos internos e externos ao seu aplicativo. Se você usa WaitForExit no seu segmento UI. Isso bloqueará o segmento UI tornando-o insensível. Se isso é um problema, genere o novo processo no evento DoWork de um BackgroundWorker. Quando o processo for encerrado, o RunWorkerCompleteEvent será ativado, alertando seu segmento UI.
Marcado como resposta por Min Zhu pessoal contingente da Microsoft, Moderador segunda-feira, 18 de julho de 2011 3:10 AM.
A Microsoft está conduzindo uma pesquisa on-line para entender sua opinião sobre o site da Msdn. Se você optar por participar, a pesquisa on-line será apresentada quando você sair do site do Msdn.
Waitforexit c # trava
Eu procurei tópicos diferentes sobre isso, mas todos usam o Process. RedirectStandardOutput = True, o que eu não.
Estou tentando abrir um processo (aplicativo de console, não feito por mim) para compilar um arquivo. acs especial para um arquivo. o. A estrutura é simples, o único argumento é o arquivo que você deseja compilar.
Mas em determinados arquivos meu aplicativo trava ao tentar abrir o processo. Aqui está o meu código:
Para iniciar o processo eu uso praticamente o mesmo código que outro cara fez em C #. E seu código está funcionando perfeitamente.
Espero que seu dia tenha sido melhor do que ontem, mas que é pior do que amanhã.
Marque como resposta se resolvi seu problema. :)
Editado por Visual Vincent sábado, 3 de janeiro de 2015 14:57.
Você comparou FileNames e Argumentos dos que trabalham e aqueles que não são? Existe alguma diferença neles, como as que funcionam, não contêm espaços em branco no FileName ou argumentos e os que trabalham não contêm espaços em branco neles? Se você achar que é o problema, então você precisa adicionar Cotações para o início e fim do FileName ou Argumentos.
Meu primeiro palpite é que os Argumentos precisam das Cotações assim porque, eu vejo espaços em branco no seu exemplo dos Argumentos.
Se você diz que não pode ser feito, eu vou tentar.
Editado por IronRazerz Sábado, 03 de janeiro de 2015 3:51 PM Marcado como resposta por Visual Vincent Sábado, 03 de janeiro de 2015 4:33 PM.
Todas as respostas.
Você comparou FileNames e Argumentos dos que trabalham e aqueles que não são? Existe alguma diferença neles, como as que funcionam, não contêm espaços em branco no FileName ou argumentos e os que trabalham não contêm espaços em branco neles? Se você achar que é o problema, então você precisa adicionar Cotações para o início e fim do FileName ou Argumentos.
Meu primeiro palpite é que os Argumentos precisam das Cotações assim porque, eu vejo espaços em branco no seu exemplo dos Argumentos.
Se você diz que não pode ser feito, eu vou tentar.
Editado por IronRazerz Sábado, 03 de janeiro de 2015 3:51 PM Marcado como resposta por Visual Vincent Sábado, 03 de janeiro de 2015 4:33 PM.
Você tentou o mesmo comando manualmente em uma janela de console? Talvez pare e aguarde algo. Ou não configure CreateNoWindow, ErrorDialog e WIndowStyle e veja o que acontece.
Editado por Viorel_ MVP sábado, 03 de janeiro de 2015 4:27 PM.
Você comparou FileNames e Argumentos dos que trabalham e aqueles que não são? Existe alguma diferença neles, como as que funcionam, não contêm espaços em branco no FileName ou argumentos e os que trabalham não contêm espaços em branco neles? Se você achar que é o problema, então você precisa adicionar Cotações para o início e fim do FileName ou Argumentos.
Meu primeiro palpite é que os Argumentos precisam das Cotações assim porque, eu vejo espaços em branco no seu exemplo dos Argumentos.
Se você diz que não pode ser feito, eu vou tentar.
Isso realmente aconteceu. Eu tinha esquecido que os espaços em branco tornam um novo argumento, meu bobo. Não uso argumentos de processo que muitas vezes. ;)
Espero que seu dia tenha sido melhor do que ontem, mas que é pior do que amanhã.
Marque como resposta se resolvi seu problema. :)
Editado por Visual Vincent sábado, 03 de janeiro de 2015 4:33 PM.
Você tentou o mesmo comando manualmente em uma janela de console? Talvez pare e aguarde algo. Ou não configure CreateNoWindow, ErrorDialog e WIndowStyle e veja o que acontece.
Fazê-lo da maneira normal (arrastar e soltar, ou fazê-lo via CMD) funciona, sim.
Espero que seu dia tenha sido melhor do que ontem, mas que é pior do que amanhã.
Marque como resposta se resolvi seu problema. :)
Se você diz que não pode ser feito, eu vou tentar.
Editado por IronRazerz sábado, 3 de janeiro de 2015 16:39.
A Microsoft está conduzindo uma pesquisa on-line para entender sua opinião sobre o site da Msdn. Se você optar por participar, a pesquisa on-line será apresentada quando você sair do site do Msdn.
Eu procurei tópicos diferentes sobre isso, mas todos usam o Process. RedirectStandardOutput = True, o que eu não.
Estou tentando abrir um processo (aplicativo de console, não feito por mim) para compilar um arquivo. acs especial para um arquivo. o. A estrutura é simples, o único argumento é o arquivo que você deseja compilar.
Mas em determinados arquivos meu aplicativo trava ao tentar abrir o processo. Aqui está o meu código:
Para iniciar o processo eu uso praticamente o mesmo código que outro cara fez em C #. E seu código está funcionando perfeitamente.
Espero que seu dia tenha sido melhor do que ontem, mas que é pior do que amanhã.
Marque como resposta se resolvi seu problema. :)
Editado por Visual Vincent sábado, 3 de janeiro de 2015 14:57.
Você comparou FileNames e Argumentos dos que trabalham e aqueles que não são? Existe alguma diferença neles, como as que funcionam, não contêm espaços em branco no FileName ou argumentos e os que trabalham não contêm espaços em branco neles? Se você achar que é o problema, então você precisa adicionar Cotações para o início e fim do FileName ou Argumentos.
Meu primeiro palpite é que os Argumentos precisam das Cotações assim porque, eu vejo espaços em branco no seu exemplo dos Argumentos.
Se você diz que não pode ser feito, eu vou tentar.
Editado por IronRazerz Sábado, 03 de janeiro de 2015 3:51 PM Marcado como resposta por Visual Vincent Sábado, 03 de janeiro de 2015 4:33 PM.
Todas as respostas.
Você comparou FileNames e Argumentos dos que trabalham e aqueles que não são? Existe alguma diferença neles, como as que funcionam, não contêm espaços em branco no FileName ou argumentos e os que trabalham não contêm espaços em branco neles? Se você achar que é o problema, então você precisa adicionar Cotações para o início e fim do FileName ou Argumentos.
Meu primeiro palpite é que os Argumentos precisam das Cotações assim porque, eu vejo espaços em branco no seu exemplo dos Argumentos.
Se você diz que não pode ser feito, eu vou tentar.
Editado por IronRazerz Sábado, 03 de janeiro de 2015 3:51 PM Marcado como resposta por Visual Vincent Sábado, 03 de janeiro de 2015 4:33 PM.
Você tentou o mesmo comando manualmente em uma janela de console? Talvez pare e aguarde algo. Ou não configure CreateNoWindow, ErrorDialog e WIndowStyle e veja o que acontece.
Editado por Viorel_ MVP sábado, 03 de janeiro de 2015 4:27 PM.
Você comparou FileNames e Argumentos dos que trabalham e aqueles que não são? Existe alguma diferença neles, como as que funcionam, não contêm espaços em branco no FileName ou argumentos e os que trabalham não contêm espaços em branco neles? Se você achar que é o problema, então você precisa adicionar Cotações para o início e fim do FileName ou Argumentos.
Meu primeiro palpite é que os Argumentos precisam das Cotações assim porque, eu vejo espaços em branco no seu exemplo dos Argumentos.
Se você diz que não pode ser feito, eu vou tentar.
Isso realmente aconteceu. Eu tinha esquecido que os espaços em branco tornam um novo argumento, meu bobo. Não uso argumentos de processo que muitas vezes. ;)
Espero que seu dia tenha sido melhor do que ontem, mas que é pior do que amanhã.
Marque como resposta se resolvi seu problema. :)
Editado por Visual Vincent sábado, 03 de janeiro de 2015 4:33 PM.
Você tentou o mesmo comando manualmente em uma janela de console? Talvez pare e aguarde algo. Ou não configure CreateNoWindow, ErrorDialog e WIndowStyle e veja o que acontece.
Fazê-lo da maneira normal (arrastar e soltar, ou fazê-lo via CMD) funciona, sim.
Espero que seu dia tenha sido melhor do que ontem, mas que é pior do que amanhã.
Marque como resposta se resolvi seu problema. :)
Se você diz que não pode ser feito, eu vou tentar.
Editado por IronRazerz sábado, 3 de janeiro de 2015 16:39.
A Microsoft está conduzindo uma pesquisa on-line para entender sua opinião sobre o site da Msdn. Se você optar por participar, a pesquisa on-line será apresentada quando você sair do site do Msdn.
Comments
Post a Comment