private static void TimerThreadRunner()
{
MinMaxValue<long> sleepTime = new MinMaxValue<long>(0);
List<IntervalTimer> deprecated = new List<IntervalTimer>();
while (true)
{
if (_threadWait.WaitOne((int)sleepTime.Min) == true)
break;
using (_lock.ReaderLock)
{
deprecated.Clear();
sleepTime.Reset(100);
foreach (var timer in _queue)
{
long remainTime = timer.Interval - (_stopwatch.ElapsedMilliseconds - timer._lastCallTime);
if (remainTime > 0)
sleepTime.Value = remainTime;
else
{
timer._lastCallTime = _stopwatch.ElapsedMilliseconds;
SpinWorker.Dispatch(timer._action);
// 호출횟수 만료
if (timer._remainCount != -1 &&
--timer._remainCount == 0)
deprecated.Add(timer);
}
}
}
foreach (var timer in deprecated)
timer.Dispose();
}
_timerThread = null;
}