Чтобы заблокировать основной поток, вы можете использовать ManualResetEvents, пока не завершится незавершенная операция.
, например, если вы хотите всех таймеров, чтобы выполнить по крайней мере один раз, то вы могли бы иметь System.Threading.ManualResetEvent[]
массив с начальным состоянием, установленным в несигнальный
Так где-то в вашем коде вы бы ваши настройки таймера и это связано с инициализацией waithandle.
// 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);
Если вы только хотели ждать в ожидании операции, чтобы закончить то просто изменить что-то вроде этого:
_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();
}
Я только что протестировал это, и @Peter прав: вы можете зайти в тупик, если у вас есть несколько раз. Его ответ правильный. –
Я не согласен с решением @Peter, прочитал мое Редактирование. – Tomek