Quando obtenho uma referência a System.Diagnostics.Process
, como posso saber se um processo está em execução no momento?
155
Esta é uma maneira de fazer isso com o nome:
Process[] pname = Process.GetProcessesByName("notepad");
if (pname.Length == 0)
MessageBox.Show("nothing");
else
MessageBox.Show("run");
Você pode fazer um loop em todo o processo para obter o ID para manipulação posterior:
Process[] processlist = Process.GetProcesses();
foreach(Process theprocess in processlist){
Console.WriteLine("Process: {0} ID: {1}", theprocess.ProcessName, theprocess.Id);
}
if/else
apenas uma linha de comprimento não precisam de chaves para indicar a instrução do bloco. Isso também vale paraforeach
efor
declarações. Tudo se resume ao estilo de codificação.for
. Anos de c # .net dev e eu nunca vi esse estilo. Como se costuma dizer, "você aprende algo novo todos os dias". Obrigado pela postagem e pela resposta ..Esta é a maneira mais simples que encontrei depois de usar o refletor. Eu criei um método de extensão para isso:
o
Process.GetProcessById(processId)
método chama oProcessManager.IsProcessRunning(processId)
método e lançaArgumentException
caso o processo não exista. Por alguma razão, aProcessManager
classe é interna ...fonte
Solução síncrona:
Solução assíncrona:
fonte
reshefm teve uma resposta bastante agradável; no entanto, ele não explica uma situação na qual o processo nunca foi iniciado.
Aqui está uma versão modificada do que ele postou.
Eu removi o ArgumentNullException porque, na verdade, é uma exceção de referência nula e é lançada pelo sistema de qualquer maneira. Também considerei a situação na qual o processo nunca foi iniciado, ou o método close () foi usado para fechar o arquivo. processo.
fonte
Deve ser uma linha:
fonte
Depende de quão confiável você deseja que essa função seja. Se você deseja saber se a instância específica do processo que você possui ainda está em execução e está disponível com 100% de precisão, você está sem sorte. A razão é que, a partir do objeto de processo gerenciado, existem apenas duas maneiras de identificar o processo.
O primeiro é o ID do processo. Infelizmente, os IDs de processo não são exclusivos e podem ser reciclados. A pesquisa na lista de processos por um ID correspondente indica apenas que existe um processo com o mesmo ID em execução, mas esse processo não é necessariamente seu.
O segundo item é o identificador de processo. Ele tem o mesmo problema que o ID e é mais complicado trabalhar com ele.
Se você procura confiabilidade de nível médio, basta verificar na lista de processos atual um processo com o mesmo ID.
fonte
Process.GetProcesses()
é o caminho a percorrer. Mas você pode precisar usar um ou mais critérios diferentes para encontrar seu processo, dependendo de como ele está sendo executado (por exemplo, como um serviço ou aplicativo normal, independentemente de ter ou não uma barra de título).fonte
Talvez (provavelmente) esteja lendo a pergunta incorretamente, mas você está procurando a propriedade HasExited que informará que o processo representado pelo objeto Process foi encerrado (normalmente ou não).
Se o processo ao qual você tem uma referência tiver uma interface do usuário, você poderá usar a propriedade Responding para determinar se a interface do usuário está respondendo atualmente à entrada do usuário ou não.
Você também pode definir EnableRaisingEvents e manipular o evento Exited (enviado de forma assíncrona) ou chamar WaitForExit () se desejar bloquear.
fonte
Você pode instanciar uma instância do Process uma vez para o processo desejado e continuar acompanhando o processo usando o objeto .NET Process (ele continuará rastreando até você chamar Fechar nesse objeto .NET explicitamente, mesmo se o processo que estava rastreando estiver morto [isso permite que você tenha tempo para fechar o processo, também conhecido como ExitTime etc.])
Citando http://msdn.microsoft.com/en-us/library/fb4aw7b8.aspx :
fonte
Tentei a solução da Coincoin:
Antes de processar um arquivo, copio-o como um arquivo temporário e o abro.
Quando terminar, fecho o aplicativo se ele ainda estiver aberto e excluo o arquivo temporário:
Eu apenas uso uma variável Process e verifico depois:
Mais tarde eu fecho o aplicativo:
Funciona (até agora)
fonte
openApplication.HasExited()
, HasExited não é uma função. A maneira correta seriaopenApplication.HasExited
.Apesar da API suportada das estruturas .Net em relação à verificação do processo existente pelo ID do processo, essas funções são muito lentas. Custa uma enorme quantidade de ciclos de CPU para executar Process.GetProcesses () ou Process.GetProcessById / Name ().
Um método muito mais rápido para verificar um processo em execução por ID é usar a API nativa OpenProcess () . Se o identificador de retorno for 0, o processo não existe. Se o identificador for diferente de 0, o processo está em execução. Não há garantia de que esse método funcione 100% o tempo todo devido à permissão.
fonte
Existem muitos problemas associados a isso, pois outros parecem abordar parcialmente:
Se as propriedades que outras pessoas mencionaram são internas ou não, você ainda pode obter informações através da reflexão, se a permissão permitir.
Você pode definir o código Win32 para o Snapshot ou usar o WMI, que é mais lento.
Outra opção seria OpenProcess / CloseProcess, mas você ainda terá os mesmos problemas, com exceções lançadas da mesma forma que antes.
Para WMI - OnNewEvent.Properties ["?"]:
fonte
Além disso, você pode usar um timer para verificar o processo todas as vezes
fonte
length == 0
deve ser exibidoNot Working
), mas ainda faz o trabalho.