Beklemedeki tüm işlemler tamamlanana kadar ana iş parçacığını engellemek için ManualResetEvents kullanabilirsiniz. Eğer ayarlı başlangıç durumuna sahip bir System.Threading.ManualResetEvent[]
dizi olabilir tüm zamanlayıcılar en az bir kere, sonra yürütmek istiyorsanız örneğin
olmayan sinyal kodunuzda Yani bir yerde
Eğer zamanlayıcı kurulum olurdu ve waithandle başlatıldı.
// 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);
sen ancak o zaman basitçe böyle bir şeye değiştirmek bitirmek için operasyonlarını bekleyen beklemek isteseydim:
_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();
}
Sadece bunu test ettim ve @Peter haklı: Birden çok kez atıyorsanız bir kilitlenme alabilirsiniz. Cevabı doğru olanı. –
@Peter çözümüne katılmıyorum, Düzenlememi oku. – Tomek