Click here to Skip to main content
Click here to Skip to main content

A component for event scheduling inside an application

By , 30 Sep 2004
 

Introduction

Every typical server or service application need scheduling of some events inside the application. These events generally are supposed to wake up at certain determined times to do self checks, check statuses of threads, or typically refresh resources once in a while, and so on. This requires shorter and long time scheduling of events inside the application. The most common approach is to use timers for different tasks and attach them to threads. A scheduler component is presented in this article for simplifying a way to create and maintain event scheduling inside an application.

Using the code

The best example to create and use the Schedule classes is in the demo application. This piece of code inside the demo creates all the types of schedule objects implemented in the library, and also provides a delegate ScheduleCallBack() for the schedule to call back for OnTrigger event.

// create and add different types of schedules
Schedule s = new IntervalSchedule("Test_Interval", 
             DateTime.Now.AddMinutes(1), 45, TimeSpan.Zero, 
             new TimeSpan(TimeSpan.TicksPerDay));
s.OnTrigger += new EventScheduler.Invoke(ScheduleCallBack);
Scheduler.AddSchedule(s);

s = new OneTimeSchedule("Test_Onetime", DateTime.Now.AddMinutes(1.5));
s.OnTrigger += new EventScheduler.Invoke(ScheduleCallBack);
Scheduler.AddSchedule(s);

s = new DailySchedule("Test_daily", DateTime.Now.AddMinutes(2));
s.OnTrigger += new EventScheduler.Invoke(ScheduleCallBack);
Scheduler.AddSchedule(s);

s = new WeeklySchedule("Test_weekly", DateTime.Now.AddMinutes(2.5));
s.OnTrigger += new EventScheduler.Invoke(ScheduleCallBack);
Scheduler.AddSchedule(s);

s = new MonthlySchedule("Test_monthly", DateTime.Now.AddMinutes(3));
s.OnTrigger += new EventScheduler.Invoke(ScheduleCallBack);
Scheduler.AddSchedule(s);

As can be seen, the three main lines are to:

  • create a Schedule instance
  • subscribe to the OnTrigger event, and
  • add the Schedule to the Scheduler's list

That's it! To see this in action, run the demo application shown below and click on Test Code button. This will create an instance of each schedule and gives a feeling of what the scheduler can do.

Design and Code details

The following class diagram shows the different classes in the scheduler library and their relationship.

At the root of the library is the Schedule class which implements IComparable interface. The IComparable interface provides the CompareTo(Object) method which is used to compare two Schedule objects for sorting the list of schedules to determine the sequence of invocation times for the timer.

The library already provides general Schedules like OneTimeSchedule (used for raising an event only once), IntervalSchedule (used to raise an event at regular intervals), DailySchedule, WeeklySchedule and MonthlySchedule, which are self explanatory. The Schedule base class has generic properties like Name, Type, NextInvokeTime etc. used by all derived objects, and some specific properties like Interval which is used in this case only by IntervalSchedule.

These are the steps through which the Scheduler goes through for scheduling an event:

  • A static timer (Scheduler.Timer) with a call back method (DispatchEvents) is created and initially put to sleep.
  • Schedules are created either by code or by GUI. Individual conditions are checked in the Schedule's constructor.
  • When ever a Schedule object is added to the Scheduler using AddSchedule(Schedule s) method:
    • the list is sorted. The list which is an ArrayList in turn uses the Schedule.CompareTo(Object) method to determine the sorting order.
    • the NextInvokeTime of the first element in the list is used by the Timer to decide when to wake up next.
  • When the Timer wakes up:
    • it calls DispatchEvents call back
    • which calls TriggerEvents() on the first Schedule object in the list

A Schedule's view GUI is also provided with the library to manage the schedules through a GUI as a singleton class (ScheduleUI) which is created by the static method ScheduleUI.ShowSchedules(). This GUI uses the Scheduler.OnSchedulerEvent event provided by Scheduler to track when a Schedule is created, deleted, or invoked.

Typically, this GUI can be used for administration of schedules and also to create or delete them easily. Once a schedule is created, it can be accessed programmatically using Scheduler events or the name of the Schedule itself.

For e.g., the following code inside ScheduleUI class shows how the Scheduler events are used to refresh the list of Schedules.

public void OnSchedulerEvent(SchedulerEventType type, string scheduleName)
{
    switch(type)
    {
        case SchedulerEventType.CREATED:
            ListViewItem lv = SchedulesView.Items.Add(scheduleName);
            Schedule s = Scheduler.GetSchedule(scheduleName);
            lv.SubItems.Add(s.Type.ToString());
            lv.SubItems.Add(s.NextInvokeTime.ToString("MM/dd/yyyy hh:mm:ss tt"));
            break;
        case SchedulerEventType.DELETED:
            for (int i=0; i<SchedulesView.Items.Count; i++)
                if (SchedulesView.Items[i].Text == scheduleName)
                    SchedulesView.Items.RemoveAt(i);
            break;
        case SchedulerEventType.INVOKED:
            for (int i=0; i<SchedulesView.Items.Count; i++)
                if (SchedulesView.Items[i].Text == scheduleName)
                {
                    Schedule si = Scheduler.GetSchedule(scheduleName);
                    SchedulesView.Items[i].SubItems[2].Text =
                        si.NextInvokeTime.ToString("MM/dd/yyyy hh:mm:ss tt");
                }
            break;
    }
    SchedulesView.Refresh();
}

Another critical piece of code is the bool[] m_workingWeekDays array in the Schedule base class, in which the active week days are stored. The bool NoFreeWeekDay() and bool CanInvokeOnNextWeekDay() use this array to determine if a schedule can run on a week day.

Similarly, the bool IsInvokeTimeInTimeRange() determines if a schedule can run in a time range on any given day. Please refer to comments in the code if you are interested to get into the details.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Sriram Chitturi
Architect
United States United States
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
QuestionLicence??memberpippo pioppo30 Aug '12 - 3:24 
QuestionquerymemberApurva Kunkulol9 May '12 - 21:41 
GeneralMy vote of 3memberprogrammerdon22 Mar '12 - 9:18 
GeneralMy vote of 5membermanoj kumar choubey12 Feb '12 - 20:37 
Generaltake a look at QuartzmemberChris Tracy17 May '08 - 9:30 
GeneralRe: take a look at QuartzmemberJ0J0_28 Jun '08 - 3:18 
GeneralVS 2008 problem: Cross-thread operation not validmemberMr_AndersonNET5 May '08 - 23:14 
GeneralRe: VS 2008 problem: Cross-thread operation not validmemberPeeter15 Jan '10 - 9:59 
AnswerRe: VS 2008 problem: Cross-thread operation not validmemberPrabakar Samiyappan20 Feb '11 - 7:23 
Questionnew version for schedle?memberqq3444863510 Apr '08 - 2:59 
new version for schedle?
you send my eamil?
thanks
QuestionPersist in a databasemembercamlopes21 Jan '08 - 4:33 
GeneralThanks for the ideamemberJoseph Wee27 Nov '07 - 12:57 
GeneralRe: Thanks for the ideamemberSriram Chitturi28 Nov '07 - 0:06 
GeneralRunning without GUImemberroseen25 Sep '07 - 21:51 
GeneralRe: Running without GUImembersamphil26 Sep '07 - 2:42 
GeneralNew versionmemberdima polyakov21 Sep '07 - 10:16 
GeneralRe: New versionmemberingos200722 Sep '07 - 11:23 
GeneralRe: New versionmemberdima polyakov23 Sep '07 - 10:56 
GeneralRe: New versionmembersamphil26 Sep '07 - 2:40 
GeneralRe: New versionmemberdima polyakov26 Sep '07 - 5:07 
GeneralPerhaps you should read up on 'lock'memberrobvon18 Sep '07 - 23:20 
GeneralFIX - Intervals were not expiring.memberkurios23 Aug '07 - 11:22 
GeneralPlz upload the updated versionmemberBill_Gates26 Feb '07 - 21:01 
GeneralNew ProgrammermemberDoritkatz20 Jan '07 - 23:28 
GeneralRe: New Programmermembertridex18 Jun '07 - 3:48 
Questiona gread deal of schedues will to runmemberhou12614 Nov '06 - 13:39 
GeneralA great articlememberAsad_KA22 Sep '06 - 10:59 
QuestionEvent SchedulermemberNicos Andreou20 Sep '06 - 23:01 
QuestionHow to have params passed into ScheduleCallBackmemberhannalu14 Feb '06 - 12:33 
AnswerRe: How to have params passed into ScheduleCallBackmemberBraveShogun19 Dec '06 - 1:45 
Generalsupport / bugfixesmemberKylixs9 Oct '05 - 7:05 
GeneralRe: support / bugfixes [modified]memberGonzalo Brusella23 Jun '06 - 9:10 
GeneralRe: support / bugfixesmemberDanilo Corallo30 Aug '06 - 3:37 
GeneralRe: support / bugfixesmemberGonzalo Brusella30 Aug '06 - 4:23 
GeneralThreads problemmemberfredrikp22 Aug '05 - 5:20 
GeneralRe: Threads problemsussAnonymous28 Aug '05 - 13:16 
GeneralNovice User How to integrate with existing codememberckandreou21 Jun '05 - 10:29 
GeneralVb.netmembertobbylee1325 May '05 - 9:06 
GeneralRe: Vb.netmemberBenjamin Hall14 Jun '05 - 13:04 
GeneralRe: Vb.netmemberDoritkatz20 Jan '07 - 23:27 
QuestionRe: Vb.netmembercorym26 Jul '07 - 2:39 
GeneralWeekdays bugmemberyesildal8 Apr '05 - 16:59 
QuestionUpdates?memberMatt Philmon6 Apr '05 - 7:35 
AnswerRe: Updates?membersbouli30 May '05 - 2:39 
GeneralRe: Updates?memberDanilo Corallo30 Aug '06 - 3:36 
GeneralSrirammembermike_oop14 Mar '05 - 5:31 
GeneralSerialized SchedulesmemberPaul Patterson8 Mar '05 - 4:33 
GeneralRe: Serialized SchedulesmemberDanilo Corallo23 Aug '06 - 22:52 
Generalschedule a method callmembercheelam_mze24 Feb '05 - 0:57 
QuestionRe: schedule a method callmemberBraveShogun19 Dec '06 - 1:51 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web04 | 2.6.130516.1 | Last Updated 1 Oct 2004
Article Copyright 2004 by Sriram Chitturi
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid