serviço de instância única
-
22-08-2019 - |
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 !!
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!