Tuesday 21 November 2017

C # Thread Waitforexit


C 3.5 Winforms app. Eu tenho um temporizador que dispara a cada 30 segundos em segmento separado (tudo o que faz é escrever uma seqüência de texto para a janela de saída VS). Eu também tenho outro thread que espera por um determinado processo para terminar se ele inicia. Por exemplo winword. exe. Nessa linha eu tenho esse código: E ele vai sentar lá e esperar winword. exe para sair. Isso funciona bem. No entanto, enquanto ele está sentado lá esperando por winword. exe para sair, o timer de 30 segundos em um segmento completamente separado (que envia texto para a janela de saída) nunca é executado. Se eu esperar 3 minutos (para que o outro timer deve executar 6 vezes neste momento, mas não enquanto WaitForExit () está esperando), e então eu saio winword. exe de repente o meu outro temporizador começa a correr 6 vezes ao mesmo tempo . É como se houvesse um atraso no evento do temporizador e, de repente, o. Net quer executá-lo ao mesmo tempo. Por que p. WaitForExit () parece bloquear o meu aplicativo inteiro, embora eu tenha executando a partir de um segmento separado no meu aplicativo (não o thread principal da interface do usuário) Editar: Sim, ele está em um segmento separado. Aqui está o código que eu uso para iniciá-lo: Aqui está o ProcessCheck () método que eu tenho: Você tem a idéia certa Peter, explicação errada. Chamar Control. Invoke executa o delegado especificado no thread de UI e bloqueia o segmento de chamada até que o segmento de UI conclua sua execução. O que está acontecendo no código acima é que p. WaitForExit está bloqueando tanto o segmento de UI (porque ele está executando no segmento de UI) quanto o segmento de chamada (que está aguardando o thread de UI). Ndash Tergiver Jul 30 12 às 17:49 fraXis Você pode usar BeginInvoke, mas que ainda chamaria WaitForExit sobre o thread UI e bloqueá-lo. Se o código que chama Invoke atualmente, estiver em um thread de plano de fundo, você pode chamar WaitForExit diretamente o que fará com que o segmento de plano de fundo bloqueie em vez do segmento de UI. Se você fornecer mais alguns detalhes sobre o que você realmente está tentando fazer, alguém pode ser capaz de fornecer mais detalhes. Ndash Peter Ritchie Jul 30 12 at 17: 52Como permanente é WaitForExit (). Quero dizer, existe algo / uma alternativa pode fazer para quebrar a espera, caso contrário, vou executar o meu segmento em uma função separada, e controlá-lo por variáveis ​​globais. Razão - um segmento CMD. EXE, com um aplicativo de console em execução, que precisamos cancelar antes de o thread executar o seu curso. Aqui está o que temos: ProcessStartInfo psi novo ProcessStartInfo (quotCMD. EXEquot, consulta) psi. UseShellExecute useShellExec psi. RedirectStandardOutput stdout psi. CreateNoWindow noWindow hbProc novo Process () hbProc Process. Start (psi) hbProc. WaitForExit () Bem, você poderia Use: while (hbProc. WaitForExit (someTimeout)) se (ShouldCancel) break Em 19 de setembro, 5:15 am, quotMarc Gravellquot ltmarc. grav. Gt escreveu: gt Bem, você poderia usar: gt gt enquanto (hbProc. WaitForExit (someTimeout)) gt if (ShouldCancel) quebrar gt gt gt gt gt Marc (nota, não há razão para chamar tanto o novo Process () (Psi) Ou você pode usar: hbProc new Process () hbProc. EnableRaisingEvents true hbProc. Exited novo EventHandler (functionToCallAfterProcesit) hbProc. StartInfo psi hbProc. Start () // outro thread-on quer cancelar o evento: hbProc - new EventHandler (functionToCallAfterProcesit) Em ambos os casos, basta estar ciente da condição de corrida potencial entre o processo de sair eo desejo de cancelar a espera. Em 19 de setembro, 4:11 am, Alistair George ltnon xtra. co. nzgt escreveu: gt How Permanente é WaitForExit (). Quero dizer, existe algo / uma alternativa gt pode fazer para quebrar a espera, caso contrário, vou executar o meu thread gt em uma função separada, e controlá-lo por variáveis ​​globais. Gt Razão - um segmento CMD. EXE, Com um aplicativo de console em execução, que nós gt necessidade de cancelar antes de o thread executando o seu curso. Gt Aqui está o que temos: gt ProcessStartInfo psi novo gt ProcessStartInfo (quotCMD. EXEquot, consulta) gt psi. UseShellExecute useShellExec gt psi. RedirectStandardOutput stdout gt psi. CreateNoWindow noWindow gt hbProc novo Processo () gt hbProc Process. Start (psi) gt HbProc. WaitForExit () gt gt Obrigado, gt Alistair. Você pode matar o segmento em execução WaitForExit () ou usar a sobrecarga que permite especificar um tempo limite bool WaitForExit (int msToWait). Se você executá-lo em um segmento separado e matá-lo você está indo para obter uma exceção interrompida. Você pode querer certificar-se de que o processo que você começou não está ainda em execução (se for, mate-o). Gt Você pode matar o segmento em execução WaitForExit () ou usar a sobrecarga gt que permite especificar um timeout bool WaitForExit (int gt msToWait). Se você executá-lo em um segmento separado e matá-lo vai gt vai obter uma exceção interrompida. Você pode querer certificar-se de que o processo gt que você começou isnt ainda está funcionando (se for, mate-o). Gt Obrigado rapazes com as sugestões que são úteis. Irá aconselhar que opção funcionou melhor. Al. Copyright cópia 2005-2016, TechTalkz. Todos os direitos reservados. Eu tenho uma situação onde eu quero executar um arquivo e, em seguida, excluir o arquivo executável quando a execução é feita. Eu uso System. Diagnostics. Process. Start () para executar o arquivo, e usar. WaitForExit () para aguardar o processo para concluir. Em seguida, uso File. Delete (filename) para excluir o arquivo executável. O problema é que, às vezes, File. Delete irá falhar com o seguinte erro: Isso me leva a acreditar que, de alguma forma, o processo ainda está vivo e bloquear o arquivo executável mesmo após a chamada. WaitForExit () retorna. Eu encontrei outros threads na rede que descrevem o mesmo comportamento, mas eu não encontrei qualquer que concluir com uma razoável explicação ou solução para o problema, além de sugestões de colocar um Sleep (n) após WaitForExit (). Exemplos: Aqui está um programa de exemplo que reproduz o problema para mim. Eu testei no Windows XP e no Windows 7, e ambos eventualmente falham em algum ponto com o mesmo erro. Observe também que o executável ss. exe é um simples aplicativo de console quotHello Worldquot simples. E a saída normalmente parece algo como (com quantidade variável de iterações antes do acidente ocorre): Qualquer idéia sobre por que isso acontece, e se houver alguma correção para isso (além de colocar dorme no código) Sexta-feira, 08 de janeiro de 2010 3 : 40 PM A razão é que, embora o processo seja concluído, pode demorar alguns milissegundos para o sistema operacional terminar de destruí-lo. É um sistema operacional multi-tarefa, afinal, está tentando atender a todos ao mesmo tempo. Infelizmente, não há maneira de saber quando o arquivo não está mais bloqueado (presicely). Quando você WaitForExit, você está criando um objeto de bloqueio no objeto de processo. O objeto de processo não pode ser destruído até que o bloqueio é liberado e você não pode esperar em algo que não existe (tipo de frango e ovo de questão). Então, a única coisa razoável que você pode fazer é continuar tentando, algo como: Marcado como resposta por Samuel Stanojevic Sexta-feira, 08 de janeiro de 2010 16:20 Editado por Tergiver sexta-feira, 08 de janeiro de 2010 16:20 mudou para bool, loop infinito Correcção Sexta-feira, 08 de Janeiro de 2010 16:15 Microsoft está a realizar uma pesquisa online para compreender a sua opinião sobre o site Msdn. Se você optar por participar, o questionário on-line será apresentado a você quando você deixar o site Msdn. Você gostaria de participar

No comments:

Post a Comment