public DedicatedThreadScheduler(ActorSystem system)
{
_log = Logging.GetLogger(system, this);
var precision = system.Settings.Config.GetTimeSpan("akka.scheduler.tick-duration");
var thread = new Thread(_ =>
{
var allWork = new List<ScheduledWork>();
while (true)
{
if (system.WhenTerminated.IsCompleted)
{
return;
}
Thread.Sleep(precision);
var now = HighResMonotonicClock.Ticks;
ScheduledWork work;
while(_workQueue.TryDequeue(out work))
{
//has work already expired?
if (work.TickExpires < now)
{
work.Action();
}
else
{
//buffer it for later
allWork.Add(work);
}
}
//this is completely stupid, but does work..
if (allWork.Count > 0)
{
var tmp = allWork;
allWork = new List<ScheduledWork>();
foreach (var bufferedWork in tmp)
{
if (bufferedWork.TickExpires < now)
{
bufferedWork.Action();
}
else
{
allWork.Add(bufferedWork);
}
}
}
}
}) {IsBackground = true};
thread.Start();
}