Wednesday, 18 April 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 obsoletos que 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.

Process. WaitForExit ()
Se não pStart. HasExited Then.
While Não pStart. HasExited ()
If pStart. StartTime & lt; Now. AddSeconds (120) Então.
Facebook Twitter LinkedIn peritos-troca / dúvidas / 23298651 / Process-WaitForExit. html copy.
Publicação destacada.
Nuvem de Concerto para Provedores de Software & amp; ISVs.
Os Concerto Cloud Services podem ajudá-lo a se concentrar na evolução de suas ofertas de aplicativos e, ao mesmo tempo, oferecer a melhor experiência em nuvem para seus clientes? De DevOps a modelos de receita e suporte ao cliente, a resposta é sim!

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 o tempo limite) para concluir, 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 deadlock e ter um tempo limite se o processo de execução der errado?
Essa técnica será interrompida se o buffer de saída for preenchido com mais de 4KB 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 Process tem um evento que é acionado quando a saída é enviada para o StandardOutput - OutputDataReceived.
Se você assinar o evento, você poderá ler a saída quando ela chegar e, no seu loop de programa principal, você ainda pode esperar o tempo limite.
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 () para o segundo exemplo.

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.

Processo waitforexit timeout kill
Esta pergunta pode parecer um pouco estranha, mas estou tentando executar VS2005 através de um processo e executar um comando específico e eu waitforexit (). Estou redirecionando minha entrada e saída com sucesso, mas de vez em quando eu recebo uma Window Window / Message Window Window. O problema é que eu estou remoting, então quando esta mensagem / janela ocorre durante a execução do processo, eu vou pendurar a menos que eu logar na outra máquina (remota) e fechar a janela.
Existe alguma maneira de matar programaticamente esta janela ou possivelmente desativar a mensagem / janela? Eu pensei em executar o VS em uma execução silenciosa (ainda tenho que encontrar uma maneira de fazê-lo). Eu também tentei ver se há algo que está sendo lançado quando isso ocorre comparado ao quando não.
Bem, eu tentei usar FindWindow e FindWindowEx junto com SendMessage, mas não consegui encontrar o identificador de janela correto. Mas, como sei que uma Caixa de Mensagens do Relatório de Erros do Windows será exibida, verifiquei se era seu próprio processo (e é). O processo é dwwin. exe (Dr. Watson Win) e tudo o que eu tinha que fazer era permitir que eu corrigisse o problema atual. Substitua o atual bloco de código abaixo para a declaração WaitForExit () que eu tinha anteriormente.
Proc. WaitForExit (60000); // um minuto.
Processo [] ProcArray = Process. GetProcessesByName (& quot; dildin & quot;);
foreach (Process ProcessFound em ProcArray)
Também verifiquei se você conseguiu obter o Process. MainWindowTitle (), mas ele está definido como & quot; & quot ;. Então isso é um hack e eu realmente não gosto de usá-lo, mas funciona para a execução atual.
Todas as respostas.
Você pode ser específico com o erro que está recebendo?
Isso ocorre apenas quando você está redirecionando a entrada e a saída?
Você está executando console? Cmd & quot; ?
Se sim, você deve digitar exit também.
// Processo interrompido antes do período de tempo limite.
// Imprime mensagem de erro?
Gostaria de tentar isso, mas é muito um hack. Eu tenho muitos comandos diferentes que levam diferentes períodos de tempo (30 segundos a 25 minutos), então não há configurações de tempo real que eu poderia colocar sem destruir o meu desempenho. Esta função tem funcionado corretamente para vários comandos nos últimos 6 meses e agora ele decide sair para mim. Eu tentei em um computador diferente sem problemas (o que realmente está me mexendo). Eu sei que não é o redirecionamento de saída / erro porque uma nova WINDOW está sendo criada no servidor ao qual eu estou remoting. Assim que eu fechar essa janela, meu processo sai como esperado e a saída correta é exibida no lado do Usuário.
Obrigado pela sua ajuda, mas estou realmente frustrado com este problema.
Sem conhecer os detalhes da mensagem, estamos apenas adivinhando o problema.
Você instalou o beta 3.5 beta ou o Visual Studio 2008 beta?
Como você está usando o Processo para iniciar o programa, Process. Start (& quot; file. exe & quot;), ou você está usando ProcessStartInfo?
Não, eu tenho 2003 e 2005 instalados.
proc = new Process ();
procSI = novo ProcessStartInfo ();
Em seguida, configurei um novo tópico para o StandardError e StandardOutput.
Depois escrevo meus comandos e.
se (redirecionando o padrão para fora)
Inicie o tópico para o st. Fora.
Se (redirecionando o erro padrão)
Inicie o tópico para o st. erro.
Proc. WaitForExit (); & lt; -------- é onde ocorre a janela Generic Windows Reporting de Erros.
Eu traduzi o que pude da Janela que aparece.
Veja também: Microsoft Visual Studio 2005, clique aqui para exibir o artigo traduzido
Porque o problema ocorre, ele termina o Microsoft Visual Studio 2005. Aplicando inconvenientes, não há desculpa.
Obrigado novamente por todo o seu tempo.
Por que você está fazendo isso? Você não possui esse fluxo, então você não deve fechá-lo.
Isso é um erro de digitação? Antes de você falar sobre uma variável chamada "proc", não "Proc". Então, isso é simplesmente uma referência nula porque você está tentando invocar um método em uma referência diferente de "proc"?
Você não deseja fechar o objeto sIn até que o aplicativo tenha saído se você estiver redirecionando. Se o aplicativo grava a saída padrão ou lê da entrada padrão depois de fechar qualquer um desses, isso pode causar uma exceção.
Você tem o rastreamento da pilha dessa mensagem de erro?
Você não deseja fechar o objeto sIn até que o aplicativo tenha saído se você estiver redirecionando.
Não se deve fechar nenhum desses fluxos. O objeto Process possui-os e é o responsável pela limpeza após ele mesmo. Deve-se, na melhor das hipóteses, chamar Process. Dispose () depois de terminar com o objeto Process.
Eu criei o SQL Server do StreamWriter antes de criar o objeto Proc Process. Eu então redireciono a entrada após o comando proc. Start (), então, como eu não possuo isso? Independentemente disso, posso fazer a mudança para mover o sIn. Close () para depois da chamada WaitForExit para ver se isso faz alterações.
O Proc era um tipo, deveria ter sido proc.
Novamente, não é uma mensagem de erro, portanto, não há rastreamento de pilha. O redirecionamento do meu StandardError está vazio eo redirecionamento de saída padrão contém o que eu esperava, mas nada indicando que ocorreu um erro. É por isso que tudo ainda funciona depois de fechar a janela Relatório de erros do Windows.
Posso publicar o que acontece depois de mover a linha sIn. Close () abaixo da linha WaitForExit ().
Você não deseja fechar o objeto sIn até que o aplicativo tenha saído se você estiver redirecionando.
Não se deve fechar nenhum desses fluxos. O objeto Process possui-os e é o responsável pela limpeza após ele mesmo. Deve-se, na melhor das hipóteses, chamar Process. Dispose () depois de terminar com o objeto Process.
Ok, estou fazendo Process. Fechar no último bloco do meu código, então deve ser cuidada então.
Perdoem o meu comentário "não possuírem" o que fiz anteriormente. Acabei de voltar do almoço e estava perdendo o fato de que o processo tem controle sobre isso.
Process. Close é o método recomendado para fechar os fluxos de entrada padrão e padrão (e padrão).
Eu ficaria surpreso se o método Dispose não chamasse de Fechar, pelo menos como parte de sua operação. Eu preferiria usar o fato de que, como o Process implementa IDisposable (indiretamente através do Componente de extensão que o implementa), deve-se chamar Dispose e deixar isso para a limpeza apropriada. Eu não recomendaria invocar Process. Close em vez de, nem além de, Process. Dispose.
Process. Close é o método recomendado para fechar os fluxos de entrada padrão e padrão (e padrão).
Eu ficaria surpreso se o método Dispose não chamasse de Fechar, pelo menos como parte de sua operação. Eu preferiria usar o fato de que, como o Process implementa IDisposable (indiretamente através do Componente de extensão que o implementa), deve-se chamar Dispose e deixar isso para a limpeza apropriada. Eu não recomendaria invocar Process. Close em vez de, nem além de, Process. Dispose.
Como tenho certeza que você sabe, estes são funcionalmente equivalentes:
usando (SomethingDisposable myObject =.)
// use myObject aqui.
// use myObject aqui.
se (myObject! = null) myObject. Dispose ();
Então, se a primeira recomendação for usar um bloco de uso, então o próximo melhor seria chamar Dispose, não Fechar, quando, como você disse, você sabe que você terminou com o objeto.
Ao ligar apenas perto de algo que implementa IDisposable, o desenvolvedor está cometer um erro. Se Dispose fizer alguma limpeza adicional além de apenas delegar para Fechar, então o programador está configurando-se para um bug, apenas ligando para Fechar.
Pode haver um caso para chamar Close, mas somente se você não tiver terminado com o objeto, como você indicou na parte inferior da sua última resposta. Mas quando terminar com isso, chame Dispose.
Como tenho certeza que você sabe, estes são funcionalmente equivalentes:
usando (SomethingDisposable myObject =.)
// use myObject aqui.
// use myObject aqui.
se (myObject! = null) myObject. Dispose ();
Então, se a primeira recomendação for usar um bloco de uso, então o próximo melhor seria chamar Dispose, não Fechar, quando, como você disse, você sabe que você terminou com o objeto.
Ao ligar apenas perto de algo que implementa IDisposable, o desenvolvedor está cometer um erro. Se Dispose fizer alguma limpeza adicional além de apenas delegar para Fechar, então o programador está configurando-se para um bug, apenas ligando para Fechar.
Pode haver um caso para chamar Close, mas somente se você não tiver terminado com o objeto, como você indicou na parte inferior da sua última resposta. Mas quando terminar com isso, chame Dispose.
DisposableClass obj = new DisposableClass ();
IDisposable descartable = obj como IDisposable;
se (descartável! = nulo)
Mas sim, é isso que uma declaração de uso é "funcionalmente equivalente" para; mas eu não concordo chamando explicitamente Dispose na presença de um & quot; Close & quot; O método deve ser a primeira escolha devido à falta de escopo com a chamada Dispose. Por exemplo, o seguinte:
usando (processo processo = novo processo ()
. é um erro de sintaxe.
Enquanto o seguinte:
Processo process = new Process ();
// não há como garantir "processar & quot; não vai.
// seja acessado após o acima.
É um erro de tempo de execução (ObjectDisposedException). Usar fechar não causa o erro de tempo de execução:
Processo process = new Process ();
É sempre melhor trocar um erro em tempo de compilação por um erro em tempo de execução.
Então, estabeleci um ponto de interrupção após a chamada proc. WaitForExit () e ainda não atingi este ponto de interrupção. Então parece que é um problema.
Então, estabeleci um ponto de interrupção após a chamada proc. WaitForExit () e ainda não atingi este ponto de interrupção. Então parece que é um problema.
Eu tinha o serviço funcionando, mas eu parei porque tinha funcionado por 2 horas e nunca tinha o ponto de interrupção que deveria ter atingido dentro de 10 minutos de mim, começando meu cliente. Eu não comentei a linha sIn. Close () agora e voltei a iniciar o serviço e o Cliente e tudo está funcionando como antes. Posso acertar o ponto de interrupção após o WaitForExit () e eu concluir, com a mensagem de relatório de erros do Windows ainda (como era antes).
Então, no meu caso, PRECISO fechar o fluxo de entrada para poder sair do processo conforme o esperado. Existem outras idéias?
Eu posso recomment a linha sIn. Close () se você quiser checar alguma coisa.
Eu tinha o serviço funcionando, mas eu parei porque tinha funcionado por 2 horas e nunca tinha o ponto de interrupção que deveria ter atingido dentro de 10 minutos de mim, começando meu cliente. Eu não comentei a linha sIn. Close () agora e voltei a iniciar o serviço e o Cliente e tudo está funcionando como antes. Posso acertar o ponto de interrupção após o WaitForExit () e eu concluir, com a mensagem de relatório de erros do Windows ainda (como era antes).
Então, no meu caso, PRECISO fechar o fluxo de entrada para poder sair do processo conforme o esperado. Existem outras idéias?
Eu posso recomment a linha sIn. Close () se você quiser checar alguma coisa.
Como você está usando a entrada padrão e a saída padrão? Você está usando algum método ReadLine?
Peter, meu ponto é:
Se você não chamar Dispose em um objeto que implementa (direta ou indiretamente) IDisposable, então você está apenas pedindo um bug. No entanto, não quero argumentar sobre isso sem parar. Você pode continuar do jeito que você faz, e eu vou ficar com o meu. Contanto que não tenhamos que manter o código um do outro, tudo bem.
E, a propósito, um "uso" de & quot; O bloco também não o protege. Nada impede que você declare a variável fora do bloco (se eu me lembro corretamente), então ainda pode estar no escopo após o fim do bloco. Você precisa ser diligente ao escrever o código correto. Se você declara isso no & quot; usando & quot; declaração, é uma maneira. Mas descartar o uso da abordagem try / finally apenas porque deixa a variável no escopo não é realmente o ponto. Ainda precisa ser Dispose () 'D em algum lugar.
Eu tinha o serviço funcionando, mas eu parei porque tinha funcionado por 2 horas e nunca tinha o ponto de interrupção que deveria ter atingido dentro de 10 minutos de mim, começando meu cliente. Eu não comentei a linha sIn. Close () agora e voltei a iniciar o serviço e o Cliente e tudo está funcionando como antes. Posso acertar o ponto de interrupção após o WaitForExit () e eu concluir, com a mensagem de relatório de erros do Windows ainda (como era antes).
Então, no meu caso, PRECISO fechar o fluxo de entrada para poder sair do processo conforme o esperado. Existem outras idéias?
Eu posso recomment a linha sIn. Close () se você quiser checar alguma coisa.
Como você está usando a entrada padrão e a saída padrão? Você está usando algum método ReadLine?
Mais uma vez, NÃO É uma Exceção que está sendo jogada, então não vejo detalhes de exceção. Eu não vou diretamente para o bloco catch no meu código, eu retomo DIRECTAMENTE após a chamada WaitForExit (). A janela que recebo é a mesma que você obtém quando CADA produto da Microsoft fecha inesperadamente e MS quer informações sobre o Crash. Então, novamente, não há detalhes de exceção. No entanto, em um dos logs do sistema, estou recebendo uma mensagem (traduzido do japonês)
& quot; Devenv. exe aplicação erros ocorrem, versão 8.0.50727.762 dos erros ocorridos módulo msvcr80.dll, versão 8.0.50727.762, erros ocorridos endereço 0x00039001.
Para obter mais informações, go. microsoft/fwlink/events. asp o Helo e o Centro de suporte, por favor consulte. & Quot;
Estou redirecionando a entrada Padrão para passar os diferentes comandos porque estava tendo problemas para fazer com que funcionassem como eu queria formar o StartInfo. Estou redirecionando os fluxos de Saída e Erro para verificar o que eles têm neles depois que o processo foi encerrado. Isso permitirá que eu verifique qualquer coisa que eu gostaria em qualquer fluxo, uma vez que tenhamos terminado. Eu também não permite que nenhum dos threads de redirecionamento de saída ou erro se junte até que o processo tenha passado a chamada WaitForExit.
Estou completamente perplexo.
Peter, meu ponto é:
Se você não chamar Dispose em um objeto que implementa (direta ou indiretamente) IDisposable, então você está apenas pedindo um bug. No entanto, não quero argumentar sobre isso sem parar. Você pode continuar do jeito que você faz, e eu vou ficar com o meu. Contanto que não tenhamos que manter o código um do outro, tudo bem.
Eu não concordo. Não é um "erro" para não chamar Dispose. Seus recursos não serão liberados imediatamente, mas o GC os liberará se precisar da memória (assumindo que o padrão Dispose está corretamente implementado e existe um finalizador). Se a classe que você está usando implementa um & quot; Close & quot; método que não faz todas as mesmas coisas como "Dispose & quot ;, Close deve ser documentado como tal ou há um bug na classe. Eu nunca encontrei uma classe de framework que implementa IDisposable e um método Close () que introduziu um & quot; leak & quot; quando Close foi chamado sem chamar Dispose. O padrão esmagador para Dispose / Close é que Dispose calls Close, bem como a configuração de um & quot; disposto & quot; flag (usado para jogar ObjectDisposedException).
Na verdade, isso é detalhado na Referência Geral do Framework: & quot; Ocasionalmente, um nome específico do domínio é mais apropriado do que Dispose. Por exemplo, um encapsulamento de arquivo pode querer usar o nome do método Fechar. Nesse caso, implemente Dispose em particular e crie um método Close público que chame Dispose. O exemplo de código a seguir ilustra esse padrão. Você pode substituir Fechar com um nome de método apropriado para seu domínio. & Quot; de Implementar finalizar e descartar para limpar recursos não gerenciados.
Assim como & quot; Para certas classes de objetos, como arquivos ou objetos de conexão de banco de dados, um método Close representa melhor a operação lógica que deve ser executada quando o consumidor do objeto é finalizado com o objeto. & Quot; de Melhorando o Desempenho do Código Gerenciado (embora também detalhe "Em casos bem escritos, ambos são funcionalmente equivalentes". Isso implica que o uso de Close é mais claro com "representa melhor").
E, a propósito, um "uso" de & quot; O bloco também não o protege. Nada impede que você declare a variável fora do bloco (se eu me lembro corretamente), então ainda pode estar no escopo após o fim do bloco. Você precisa ser diligente ao escrever o código correto. Se você declara isso no & quot; usando & quot; declaração, é uma maneira. Mas descartar o uso da abordagem try / finally apenas porque deixa a variável no escopo não é realmente o ponto. Ainda precisa ser Dispose () 'D em algum lugar.
Mais uma vez, NÃO É uma Exceção que está sendo jogada, então não vejo detalhes de exceção. Eu não vou diretamente para o bloco catch no meu código, eu retomo DIRECTAMENTE após a chamada WaitForExit (). A janela que recebo é a mesma que você obtém quando CADA produto da Microsoft fecha inesperadamente e MS quer informações sobre o Crash. Então, novamente, não há detalhes de exceção. No entanto, em um dos logs do sistema, estou recebendo uma mensagem (traduzido do japonês)
& quot; Devenv. exe aplicação erros ocorrem, versão 8.0.50727.762 dos erros ocorridos módulo msvcr80.dll, versão 8.0.50727.762, erros ocorridos endereço 0x00039001.
Para obter mais informações, go. microsoft/fwlink/events. asp o Helo e o Centro de suporte, por favor consulte. & Quot;
Eu assumi que seu aplicativo estava gerando a mensagem (nesse caso, você sempre deve obter uma exceção e um rastreamento de pilha); não ficou claro que você retoma após a chamada para WaitForExit (). Parece-me que o aplicativo que você está executando está terminando de forma anormal. Você está executando devenv. exe? Não tenho certeza do que você pode fazer no seu aplicativo para impedir que outro aplicativo termine de forma anormal.
Estou redirecionando a entrada Padrão para passar os diferentes comandos porque estava tendo problemas para fazer com que funcionassem como eu queria formar o StartInfo. Estou redirecionando os fluxos de Saída e Erro para verificar o que eles têm neles depois que o processo foi encerrado. Isso permitirá que eu verifique qualquer coisa que eu gostaria em qualquer fluxo, uma vez que tenhamos terminado. Eu também não permite que nenhum dos threads de redirecionamento de saída ou erro se junte até que o processo tenha passado a chamada WaitForExit.
Estou completamente perplexo.
Daí a razão pela qual eu continuei afirmando que não era uma exceção e que meu código ainda funcionava o resto do caminho para a conclusão, como esperado.
Assim. Existe alguma maneira de capturar uma exceção de aplicativo dentro de um processo em execução se ainda não foi encerrado. Isso será a verdadeira questão.
Bem, eu tentei usar FindWindow e FindWindowEx junto com SendMessage, mas não consegui encontrar o identificador de janela correto. Mas, como sei que uma Caixa de Mensagens do Relatório de Erros do Windows será exibida, verifiquei se era seu próprio processo (e é). O processo é dwwin. exe (Dr. Watson Win) e tudo o que eu tinha que fazer era permitir que eu corrigisse o problema atual. Substitua o atual bloco de código abaixo para a declaração WaitForExit () que eu tinha anteriormente.
Proc. WaitForExit (60000); // um minuto.
Processo [] ProcArray = Process. GetProcessesByName (& quot; dildin & quot;);
foreach (Process ProcessFound em ProcArray)
Também verifiquei se você conseguiu obter o Process. MainWindowTitle (), mas ele está definido como & quot; & quot ;. Então isso é um hack e eu realmente não gosto de usá-lo, mas funciona para a execução atual.
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.

Processo waitforexit timeout kill
Eu estou lutando contra um par de linhas de código estúpidas com resultados muito estranhos. Estou executando o Win7.
O alvo é iniciar um arquivo de comando (.cmd) de um programa e aguardar este. cmd para finalizar (com tempo limite).
Dentro do arquivo. cmd, há um comando TASKKILL. TASKKILL / F / T / IM CI. EXE.
Funciona perfeitamente ! Mas.
Se a tela de login for exibida (o usuário foi logado, mas a sessão está bloqueada), TASKKILL está funcionando, mas WaitForExit nunca termina, mesmo após o tempo limite.
Existe alguma boa explicação para isso e uma sugestão de solução alternativa? Desde já, obrigado !
Obrigado pelo seu tempo e sugestão.
No final, eu decidi reescrever meu próprio TASKKILL com um código C # muito simples, com base em:
foreach (Process proc em Process. GetProcessByName (& quot; CI & quot;)) (Ci é o nome do processo que eu quero matar)
E milagre! funciona ! Então, estou pensando que TASKKILL faz muito mais do que simplesmente matar um processo.
Na verdade, meu bug agora está corrigido, então configurarei o thread como Respondido.
Obrigado pela sua leitura!
Marcado como Resposta dt51 sexta-feira, 8 de abril de 2016 14:42.
Todas as respostas.
Estou assumindo que o Tempo limite significa que você está definindo algum tempo para aguardar a saída do processo. Se assim for, tente sair do processo para sair. Em vez de esperar algum período de tempo.
Para mais informações, leia este artigo: Método Process. WaitForExit ()
Editado por Sabah Shariq MVP, moderador sexta-feira, 08 de abril de 2016 10:01 AM.
Obrigado pelo seu tempo e resposta. Infelizmente, isso não funciona.
Estou na idéia de que o TASKKILL fará alguma perturbação no método Process. WaitForExit. Na verdade, ambos estão trabalhando na mesma área.
Eu vou criar minha própria versão do TASKKILL a partir do C #, mas não sou tão otimista. Te informaremos.
Se você tiver outra ideia, será bem-vindo!
Tem que ser principalmente adivinhar aqui. Além dos estados elevados / não elevados, há também o conceito de uma sessão interativa / não interativa.
Qual é o contexto exato em que o código taht está sendo executado?
Process. WaitForExit () tem este pequeno aviso:
& quot; Este 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 em seu loop de mensagem. & Quot;
Pode ser que enquanto a área de trabalho estiver bloqueada (o usuário não iniciou logon corretamente), não há sessão interativa. Ou talvez nenhum dos loops de mensagens responda por padrão, pois o processamento deles custaria apenas os recursos da CPU?
Ou talvez o contrário: não ter uma sessão interativa para começar pode permitir que o programa continue a ser executado. Esse código é executado em um Serviço? Se não, que tal movê-lo para lá?
Obrigado pelo seu tempo e sugestão.
No final, eu decidi reescrever meu próprio TASKKILL com um código C # muito simples, com base em:
foreach (Process proc em Process. GetProcessByName (& quot; CI & quot;)) (Ci é o nome do processo que eu quero matar)
E milagre! funciona ! Então, estou pensando que TASKKILL faz muito mais do que simplesmente matar um processo.
Na verdade, meu bug agora está corrigido, então configurarei o thread como Respondido.
Obrigado pela sua leitura!
Marcado como Resposta dt51 sexta-feira, 8 de abril de 2016 14:42.
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.

No comments:

Post a Comment