fCraft.Scheduler.MainLoop C# (CSharp) Method

MainLoop() private static method

private static MainLoop ( ) : void
return void
        private static void MainLoop()
        {
            while ( !Server.IsShuttingDown ) {
                DateTime ticksNow = DateTime.UtcNow;

                SchedulerTask[] taskListCache = taskCache;

                for ( int i = 0; i < taskListCache.Length && !Server.IsShuttingDown; i++ ) {
                    SchedulerTask task = taskListCache[i];
                    if ( task.IsStopped || task.NextTime > ticksNow )
                        continue;
                    if ( task.IsRecurring && task.AdjustForExecutionTime ) {
                        task.NextTime += task.Interval;
                    }

                    if ( task.IsBackground ) {
                        lock ( BackgroundTaskListLock ) {
                            BackgroundTasks.Enqueue( task );
                        }
                    } else {
                        task.IsExecuting = true;

            #if DEBUG_SCHEDULER
                        FireEvent( TaskExecuting, task );
            #endif

            #if DEBUG
                        task.Callback( task );
                        task.IsExecuting = false;
            #else
                        try {
                            task.Callback( task );
                        } catch ( Exception ex ) {
                            Logger.LogAndReportCrash( "Exception thrown by ScheduledTask callback", "fCraft", ex, false );
                        } finally {
                            task.IsExecuting = false;
                        }
            #endif

            #if DEBUG_SCHEDULER
                        FireEvent( TaskExecuted, task );
            #endif
                    }

                    if ( !task.IsRecurring || task.MaxRepeats == 1 ) {
                        task.Stop();
                        continue;
                    }
                    task.MaxRepeats--;

                    ticksNow = DateTime.UtcNow;
                    if ( !task.AdjustForExecutionTime ) {
                        task.NextTime = ticksNow.Add( task.Interval );
                    }
                }

                Thread.Sleep( 10 );
            }
        }