È possibile utilizzare l'AutoResetEvent come segue:
// 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 po soluzione "intelligente" è come seguire in pseudo-codice:
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;
}
}
}
}
Uno di questi ha il vantaggio che si può spegnere il thread, solo segnalando l'evento.
Modifica
devo aggiungere, che questo codice si basa sull'ipotesi che hai solo uno di questi MyWorkerThreads() in esecuzione, altrimenti sarebbero eseguiti contemporaneamente.
In secondo luogo questo approccio - 'potrebbe essere meglio avviare un timer DOPO che l'operazione è completa ...' – hitec
Io terzo questo approccio. È anche possibile calcolare il ritardo del timer in modo dinamico per avvicinarsi ai 30 secondi. Disattiva il timer, recupera l'ora del sistema, aggiorna il database, quindi inizializza il timer successivo per sparare 30 secondi dopo l'ora salvata. Con un ritardo minimo del timer per la sicurezza. – mghie
come possiamo essere sicuri che l'operazione sarà completata in 5 secondi. l'upvote totalizza più di @jsw, ma sembra più efficace. –