Pergunta

Eu tenho um serviço que eu gostaria que ele se torne única instância, porque quando eu clico restart em services.msc, a nova instância do serviço começa quando a instância antiga ainda não ter terminado (porque tem que executar alguma ações).

O código que termina a aparência de serviços como este:

protected override void OnStop()
{
    Log.Info("STOPPING SERVICE");

    //Wait working threads to finish
    _Worker.Die();

    //Kill inner processes still running (sometimes some processes hang up and is the only way to kill them...
    ProcessUtility.KillTree(System.Diagnostics.Process.GetCurrentProcess().Id);

    //Call parent's class Stop
    base.OnStop();
}

A classe é uma subclasse de ServiceBase.

Como posso fazer a nova instância para começar somente quando a antiga tenha terminado?

thx stackpowerflowers !!

Foi útil?

Solução

Tenha um olhar para a classe Mutex . Isso permite que você crie uma sincronização lock-como primitivo que funciona em processos.

Tente este construtor que leva um nome; criar um mutex chamado, digamos, "MYSERVICENAME" na OnStart; liberá-lo em OnStop. OnStart do serviço posterior não irá continuar após o mutex até OnStop dos service releases anteriores-lo.

Outras dicas

A propósito, eu não sei que tipo do trabalhador é, mas normalmente quando você está esperando por um segmento para finalizar a chamada é join(). Você pode querer verificar que o thread principal está realmente esperando para o segmento de trabalho para terminar.

Duas questões, em primeiro lugar, você deve descobrir por que o serviço não está sendo encerrado corretamente. Uma vez que você descobrir isso você pode manter todas as instâncias adicionais de execução usando um Mutex. A implementação é explicado aqui, um artigo que encontrei no Google, ele ainda faz referência Jon Skeet. Esse cara está em toda parte!

http://www.ai.uga.edu/~mc/SingleInstance .html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top