O código abaixo também está errado!! Código correto como acima!!
Às vezes, precisamos permitir que apenas uma instância da aplicação seja executada, e quando o processo inicia, se descobrir que uma instância da aplicação está rodando, ela automaticamente para de ser executada. Normalmente implementamos isso na função Main via um mutex Mutex, que geralmente é escrito:
Quando buscamos respostas, muitas vezes entramos e saímos às pressas, ignorando as características e precauções do Mutex. Depois de um teste simples, ok, faça e use. Neste ponto, deixamos de lado um pré-requisito importante:Convenções de nomes Mutex. O método de escrita acima funciona sem problemas sob um único usuário; Em multiusuário, cada usuário pode iniciar uma instância, então uma única instância não pode ser garantida.
Se você precisar usá-lo em um servidor de terminal e permitir apenas uma instância, use o seguinte método:
Aqui está a descrição da MSDN:
Em servidores que executam serviços de terminal, o mutex nomeado do sistema pode ter dois níveis de visibilidade. Se o nome começar com o prefixo "Global\", o mutex fica visível em todas as sessões do servidor de terminal. Se o nome começar com o prefixo "Local\", o mutex só é visível na sessão do servidor de terminal que o criou. Nesse caso, cada outra sessão de servidor de terminal no servidor pode ter um mutex separado com o mesmo nome. Se você criar um mutex nomeado sem especificar um prefixo, ele receberá o prefixo "Local\". Em uma sessão de servidor de terminal, dois mutexes com prefixos de nome diferentes são mutex independentes, e os dois mutex são visíveis para todos os processos na sessão do servidor de terminais. Ou seja, os nomes dos prefixos "Global" e "Local" descrevem o intervalo do nome mutex em relação à sessão do servidor de terminal, não ao processo.
|