Vous pouvez utiliser le AutoResetEvent comme suit:
// 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...
}
}
}
Une solution légèrement plus "intelligents" est comme suivre pseudo-code:
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;
}
}
}
}
Chacune de ces derniers a l'avantage que vous pouvez arrêter le fil, juste en signalant l'événement.
Modifier
Je dois ajouter que ce code fait l'hypothèse que vous avez seulement un de ces MyWorkerThreads() Course à pied, sinon ils courent en même temps.
Je seconde cette approche - 'il vaudrait peut-être mieux démarrer une minuterie APRÈS que l'opération soit terminée ...' – hitec
Je suis le troisième de cette approche. Vous pouvez également calculer le délai de la minuterie de manière dynamique pour se rapprocher des 30 secondes. Désactivez la minuterie, obtenez l'heure du système, mettez à jour la base de données, puis initialisez la minuterie suivante pour qu'elle se déclenche 30 secondes après l'heure enregistrée. Avec un délai minimum pour la sécurité. – mghie
comment nous pouvons être sûr que l'opération sera complète en 5 secondes. upvote totalise plus que @jsw, mais son aspect est plus efficace. –