Se podría utilizar el AutoResetEvent de la siguiente manera:
// Somewhere else in the code
using System;
using System.Threading;
// In the class or whever appropriate
static AutoResetEvent autoEvent = new AutoResetEvent(false);
void MyWorkerThread()
{
while(1)
{
// Wait for work method to signal.
if(autoEvent.WaitOne(30000, false))
{
// Signalled time to quit
return;
}
else
{
// grab a lock
// do the work
// Whatever...
}
}
}
Un poco solución "inteligente" es como sigue en pseudo-código:
using System;
using System.Diagnostics;
using System.Threading;
// In the class or whever appropriate
static AutoResetEvent autoEvent = new AutoResetEvent(false);
void MyWorkerThread()
{
Stopwatch stopWatch = new Stopwatch();
TimeSpan Second30 = new TimeSpan(0,0,30);
TimeSpan SecondsZero = new TimeSpan(0);
TimeSpan waitTime = Second30 - SecondsZero;
TimeSpan interval;
while(1)
{
// Wait for work method to signal.
if(autoEvent.WaitOne(waitTime, false))
{
// Signalled time to quit
return;
}
else
{
stopWatch.Start();
// grab a lock
// do the work
// Whatever...
stopwatch.stop();
interval = stopwatch.Elapsed;
if (interval < Seconds30)
{
waitTime = Seconds30 - interval;
}
else
{
waitTime = SecondsZero;
}
}
}
}
Cualquiera de estos tiene la ventaja de que se puede apagar el hilo, simplemente señalando el evento.
Editar
debo añadir, que este código hace la suposición de que sólo tiene uno de estos MyWorkerThreads() en funcionamiento, de lo contrario se ejecutará simultáneamente.
En segundo lugar este enfoque - 'podría ser mejor iniciar un temporizador DESPUÉS de que se complete la operación ...' – hitec
Tercero, este enfoque. También puede calcular el retardo del temporizador de forma dinámica para acercarse a los 30 segundos. Desactive el temporizador, obtenga la hora del sistema, actualice la base de datos, luego inicialice el siguiente temporizador para disparar 30 segundos después de la hora guardada. Con un retraso mínimo del temporizador por seguridad. – mghie
cómo podemos estar seguros de que la operación se completará en 5 segundos. upvote totaliza más que @jsw, pero parece más efectivo. –