Puede usar ManualResetEvents para bloquear el hilo principal hasta que se completen las operaciones pendientes.
por ejemplo, si desea todos temporizadores para ejecutar al menos una vez, entonces usted podría tener una matriz System.Threading.ManualResetEvent[]
con el estado inicial se establece en no señalado
Así que en algún lugar de su código que tendría su configuración del temporizador y está asociado al waithandle asociado.
// in main setup method..
int frequencyInMs = 600000; //10 mins
Timer timer = new Timer();
timer.Elapsed += (s, e) => MyExecute();
myTimers.Add(timer)
ManualResetEvent[] _waithandles = new ManualResetEvent[10];
_waithandles[0] = new ManualResetEvent(false);
// Other timers ...
timer = new Timer();
timer.Elapsed += (s, e) => MyOtherExecute();
myTimers.Add(timer)
_waithandles[1] = new ManualResetEvent(false);
// etc, and so on for all timers
// then in each method that gets executed by the timer
// simply set ManualReset event to signalled that will unblock it.
private void MyExecute()
{
// do all my logic then when done signal the manual reset event
_waithandles[0].Set();
}
// In your main before exiting, this will cause the main thread to wait
// until all ManualResetEvents are set to signalled
WaitHandle.WaitAll(_waithandles);
Si sólo quería esperar para operaciones pendientes para terminar luego simplemente modificar a algo como esto:
_waithandles[0] = new ManualResetEvent(true); // initial state set to non blocking.
private void MyExecute()
{
_waithandles[0].Reset(); // set this waithandle to block..
// do all my logic then when done signal the manual reset event
_waithandles[0].Set();
}
Acabo de probar esto y @Peter tiene razón: puede obtener un punto muerto si lo elimina varias veces. Su respuesta es la correcta. –
No estoy de acuerdo con la solución de @Peter, lea mi edición. – Tomek