Usando o bloqueio com Threading.Timer
Eu tenho um aplicativo de serviço do Windows que usa umThreading.Timer
e umTimerCallback
para fazer algum processamento em intervalos específicos. Eu preciso bloquear esse código de processamento para apenas 1 thread por vez.
Por exemplo, o serviço é iniciado e o primeiro retorno de chamada é acionado e um encadeamento é iniciado e começa o processamento. Isso funciona bem, desde que o processamento seja concluído antes do próximo retorno de chamada. Então, por exemplo, o processamento está demorando um pouco mais do que o normal e o TimerCallback é acionado novamente enquanto outro thread está processando, eu preciso fazer esse thread esperar até que o outro thread esteja pronto.
Aqui está uma amostra do meu código:
static Timer timer;
static object locker = new object();
public void Start()
{
var callback = new TimerCallback(DoSomething);
timer = new Timer(callback, null, 0, 10000);
}
public void DoSomething()
{
lock(locker)
{
// my processing code
}
}
Esta é uma maneira segura de fazer isso? O que acontece se a fila ficar bastante substancial? Existe uma opção melhor?