보류중인 작업이 완료 될 때까지 ManualResetEvents을 사용하여 주 스레드를 차단할 수 있습니다. 당신은 당신이 설정 초기 상태를 가진 System.Threading.ManualResetEvent[]
배열을 가질 수 모든 타이머가 적어도 한 번 한 후 실행하려는 경우 예를 들어
비 신호 코드에 따라서 어딘가에
을 당신은 당신의 타이머 설정을 할 것이다 그리고 그것은 연관되어 있습니다.
// 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