Sunday 25 February 2018

Processo de espera antes do tempo limite de morte


Processo waitforexit timeout kill
Obter através da App Store Leia esta publicação em nosso aplicativo!
Como faço para matar um processo usando Vb ou C #?
Eu tenho um cenário onde eu tenho que verificar se o usuário já abriu o Microsoft Word. Se ele tiver, então eu tenho que matar o processo winword. exe e continuar a executar meu código.
Alguém tem algum código direto para matar um processo usando vb ou c #?
На этот вопрос есть ответы на Stack Overflow на русском: Убить процесс в C #
Exemplos já foram publicados aqui, mas descobri que a versão não-.exe funcionou melhor, então algo como:
Você provavelmente não precisa lidar com NotSupportedException, o que sugere que o processo é remoto.
Matar o processo do Word é possível (veja algumas das outras respostas), mas é grosseiro e perigoso: e se o usuário tiver mudanças importantes não salvas em um documento aberto? Sem mencionar os arquivos temporários temporários, isso deixará para trás.
Isso provavelmente é tão longe quanto você pode seguir nesse sentido (VB):
Isso encerrará todas as janelas do Word abertas de forma ordenada (solicitando ao usuário salvar seu trabalho, se aplicável). Claro, o usuário sempre pode clicar em 'Cancelar' neste cenário, então você deve ser capaz de lidar com este caso também (de preferência, colocando uma caixa de diálogo "por favor feche todas as instâncias do Word, caso contrário, não podemos continuar").
Aqui está um exemplo fácil de como matar todos os processos do Word.
Você pode ignorar as preocupações de segurança e criar um aplicativo muito policial simplesmente verificando se o processo do Word está sendo executado e pedindo ao usuário para fechá-lo e, em seguida, clique no botão 'Continuar' em seu aplicativo. Esta é a abordagem tomada por muitos instaladores.
Claro, você só pode fazer isso se seu aplicativo tiver uma GUI.
No meu aplicativo de bandeja, eu precisava limpar Excel e Word Interops. Então, esse método simples mata processos de forma genérica.
Isso usa um manipulador de exceção geral, mas pode ser facilmente dividido para várias exceções, como indicado em outras respostas. Posso fazer isso se meu registro produzir muitos falsos positivos (ou seja, não pode matar já morto). Mas, até agora, guia (brincadeira de trabalho).
É assim que eu liguei:
Algo assim funcionará:
É melhor prática, mais seguro e mais educado para detectar se o processo está em execução e dizer ao usuário para fechá-lo manualmente. Claro que você também pode adicionar um tempo limite e matar o processo se eles tenham ido embora.

Processo waitforexit timeout kill
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.

Processo waitforexit timeout kill
Obter através da App Store Leia esta publicação em nosso aplicativo!
c # ProcessStartInfo. Start - leitura de saída, mas com tempo limite.
Se você quiser iniciar outro processo e aguardar (com tempo limite) para terminar, você pode usar o seguinte (do MSDN).
Se você quiser iniciar outro processo e ler sua saída, então você pode usar o seguinte padrão (de SO)
Como você pode combinar os dois para ler todas as entradas, não ficar preso no impasse e ter um tempo limite se o processo em execução for errado?
Essa técnica irá pendurar se o buffer de saída for preenchido com mais de 4 KB de dados. Um método mais infalível é registrar os delegados para serem notificados quando algo é escrito no fluxo de saída. Eu já sugeri este método antes em outro post:
Você não precisa combinar os dois - a classe Processo tem um evento que dispara quando a saída é enviada para o StandardOutput - OutputDataReceived.
Se você se inscrever no evento, você poderá ler o resultado conforme ele chega e, no seu ciclo de programa principal, você ainda pode perder tempo.
Você pode tentar modificar o primeiro método para algo assim.
Você também pode usar o APM, assim:
Defina um delegado para a chamada ReadToEnd:
Em seguida, use o delegado para chamar o método como este:
EDITAR: tratamento de erros removido por clareza.
Basta adicionar tudo do primeiro exemplo abaixo da chamada WaitForExit () ao segundo exemplo.

Processo waitforexit timeout kill
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ê deixar o site Msdn.

No comments:

Post a Comment