Processo espera antes de fechar
Processo waitforexit fechar
Obter através da App Store Leia esta publicação em nosso aplicativo!
Aguarde até um processo terminar.
Eu tenho um aplicativo que faz.
para iniciar outro aplicativo 'ABC'. Eu quero aguardar até que o aplicativo final (processo morre) e continuar minha execução. Como eu posso fazer isso?
Pode haver várias instâncias do aplicativo 'ABC' executando ao mesmo tempo.
Eu acho que você só quer isso:
Consulte a página MSDN para o método. Também tem uma sobrecarga onde você pode especificar o tempo limite, então você não está esperando potencialmente para sempre.
Use Process. WaitForExit? Ou assine o evento Process. Exited se você não quer bloquear? Se isso não fizer o que você quer, por favor nos dê mais informações sobre seus requisitos.
Faço o seguinte na minha aplicação:
Há alguns recursos extras lá que você pode achar úteis.
Você pode usar a espera para sair ou você pode pegar a propriedade HasExited e atualizar sua UI para manter o usuário "informado" (gerenciamento de expectativa):
Process. WaitForExit ()
Se não pStart. HasExited Then.
Enquanto não pStart. HasExited ()
Se pStart. StartTime & lt; Now. AddSeconds (120) Então.
Facebook Twitter LinkedIn peritos-troca / dúvidas / 23298651 / Process-WaitForExit. html copy.
Para fazer perguntas e encontrar soluções.
Publicação destacada.
Serviços de consultoria Cloud da Concerto.
Deseja evitar os erros para obter todos os benefícios da nuvem? Saiba mais sobre as diferentes opções de avaliação da nossa equipe Cloud Advisory.
Se você tiver um problema semelhante, faça uma pergunta relacionada.
Gerenciamento de documentos Impressoras e scanners Software de imagens de documentos - Outras imagens e fotos Adobe Acrobat, software de fotos / gráficos, segurança, * digitalização, * PDF.
Cursos sugeridos.
658 membros fizeram perguntas e receberam soluções personalizadas nos últimos 7 dias.
Junte-se à comunidade de 500 mil profissionais da tecnologia e faça suas perguntas.
Gostei da sua resposta?
Junte-se à nossa comunidade para obter mais soluções ou fazer perguntas.
Processo waitforexit fechar
Por favor, você pode ajudar com um problema de Processo que estou enfrentando e espero que responda algumas perguntas sobre o método que estou usando.
Eu tenho um aplicativo que chama outro, espera que ele seja concluído, e continua com seu trabalho. Isso, em geral, funciona bem, mas às vezes ele congela o dispositivo (exigindo uma reinicialização suave) ou o dispositivo reabastece de qualquer maneira.
O pseudo-código é:
Dim ExitLoop como booleano.
Dim p como novo processo.
Faça algo bastante vivo correndo.
1) O waitforexit retorna logo após o Application. Exit no Application2 ou ele retorna depois que a bomba da mensagem terminar.
2) Feche a espera até que a bomba da mensagem termine. Ou fechará o retorno imediatamente e p. dispose tente dispor o processo enquanto ele ainda está fechando.
3) Não devo incomodar com waitforexit e tentar algo como o seguinte:
4) Por que um dispositivo do Windows Mobile 6 realizaria uma reinicialização suave. Poderia ficar sem memória ...
Dim ExitLoop como booleano.
Se p. HasExited Then ExitLoop = True.
Loop While Not ExitLoop.
Tentei várias implementações, mas ainda não consegui 100% de sucesso.
Obrigado pelo seu tempo.
Após novos testes, encontrei o seguinte:
O MSDN informa que não deveria estar usando process. dispose, presumivelmente isso é chamado após o processo. O fechamento terminou e está em seu próprio tópico.
Apesar do fato de que existe um processo. Na verdade, todos os exemplos da Microsoft não o usam, favorecendo o método abaixo.
thread. sleep (por um pouco)
loop enquanto não process. hasexited.
continue com sua aplicação.
Eu decidi usar o CERunAppAtTime como este todo o sistema. O exercício de diagnóstico me custou mais tempo de desenvolvimento do que deveria ter feito.
Seria útil para outros e o desenvolvimento do Compact Framework se o comportamento que experimentei pode ser explicado.
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ê deixar o site Msdn.
C # Process. WaitForExit () 与 死锁.
tabelas de eco no nível 0:
se existir InstallScripts \ Create01.sql (
sqlplus% 1 /% 2 @% 3 @InstallScripts \ Create01.sql | % HideSQLPlusRows%
se existir InstallScripts \ Create02.sql (
搞 了 两天, 最后 发现 原因 是 出现 了 死锁. 由于 标准 输出 流 被 重定向, 而 Process. StandardOutput 的 缓冲 大小 是 有 限制 的 (据说 是 4k), 所以 当 缓冲 满 了 的 时候 (执行 上面 的批处理 文件 有 很多 的 输出), 子 进程 (cmd. exe) 会 等待 主 进程 (aplicativo C #) 读取 并 释放 此 缓冲, 而 主 进程 由于 调用 了 WaitForExit () 方法, 则会 一 进 等待 子 进程 退出, 最后 形成 死锁.
tabelas de eco no nível 0:
se existir InstallScripts \ Create01.sql (
sqlplus% 1 /% 2 @% 3 @InstallScripts \ Create01.sql | % HideSQLPlusRows% & gt; Logs \ Create_% 1.txt.
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.
Por favor, você pode ajudar com um problema de Processo que estou enfrentando e espero que responda algumas perguntas sobre o método que estou usando.
Eu tenho um aplicativo que chama outro, espera que ele seja concluído, e continua com seu trabalho. Isso, em geral, funciona bem, mas às vezes ele congela o dispositivo (exigindo uma reinicialização suave) ou o dispositivo reabastece de qualquer maneira.
O pseudo-código é:
Dim ExitLoop como booleano.
Dim p como novo processo.
Faça algo bastante vivo correndo.
1) O waitforexit retorna logo após o Application. Exit no Application2 ou ele retorna depois que a bomba da mensagem terminar.
2) Feche a espera até que a bomba da mensagem termine. Ou fechará o retorno imediatamente e p. dispose tente dispor o processo enquanto ele ainda está fechando.
3) Não devo incomodar com waitforexit e tentar algo como o seguinte:
4) Por que um dispositivo do Windows Mobile 6 realizaria uma reinicialização suave. Poderia ficar sem memória ...
Dim ExitLoop como booleano.
Se p. HasExited Then ExitLoop = True.
Loop While Not ExitLoop.
Tentei várias implementações, mas ainda não consegui 100% de sucesso.
Obrigado pelo seu tempo.
Após novos testes, encontrei o seguinte:
O MSDN informa que não deveria estar usando process. dispose, presumivelmente isso é chamado após o processo. O fechamento terminou e está em seu próprio tópico.
Apesar do fato de que existe um processo. Na verdade, todos os exemplos da Microsoft não o usam, favorecendo o método abaixo.
thread. sleep (por um pouco)
loop enquanto não process. hasexited.
continue com sua aplicação.
Eu decidi usar o CERunAppAtTime como este todo o sistema. O exercício de diagnóstico me custou mais tempo de desenvolvimento do que deveria ter feito.
Seria útil para outros e o desenvolvimento do Compact Framework se o comportamento que experimentei pode ser explicado.
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ê deixar o site Msdn.
C # Process. WaitForExit () 与 死锁.
tabelas de eco no nível 0:
se existir InstallScripts \ Create01.sql (
sqlplus% 1 /% 2 @% 3 @InstallScripts \ Create01.sql | % HideSQLPlusRows%
se existir InstallScripts \ Create02.sql (
搞 了 两天, 最后 发现 原因 是 出现 了 死锁. 由于 标准 输出 流 被 重定向, 而 Process. StandardOutput 的 缓冲 大小 是 有 限制 的 (据说 是 4k), 所以 当 缓冲 满 了 的 时候 (执行 上面 的批处理 文件 有 很多 的 输出), 子 进程 (cmd. exe) 会 等待 主 进程 (aplicativo C #) 读取 并 释放 此 缓冲, 而 主 进程 由于 调用 了 WaitForExit () 方法, 则会 一 进 等待 子 进程 退出, 最后 形成 死锁.
tabelas de eco no nível 0:
se existir InstallScripts \ Create01.sql (
sqlplus% 1 /% 2 @% 3 @InstallScripts \ Create01.sql | % HideSQLPlusRows% & gt; Logs \ Create_% 1.txt.
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.
Comments
Post a Comment