Click here to Skip to main content
Licence CPOL
First Posted 28 Jul 2009
Views 29,646
Downloads 1,258
Bookmarked 150 times

TaskScheduler

By Lothar Perr | 28 Jul 2009
A simple structured and easy to use Task-Scheduler

1
1 vote, 2.3%
2
3 votes, 7.0%
3
4 votes, 9.3%
4
35 votes, 81.4%
5
4.88/5 - 43 votes
4 removed
μ 4.63, σa 1.24 [?]

Introduction

Task Scheduler is a class that schedules and automatically fires events at a time you specify. All important triggers are implemented: OnlyOneTime, Daily, Weekly and Monthly.

So why another Task Scheduler?

We need for one of our Projects a Scheduler that

  1. Can check a Date or show all Dates on which the trigger will fire.  (See the Demo, Button "Show List")
  2. We need to schedule Tasks not only Daily, Weekly,... we need a combination of them. f.e. every Wednesday (Weekly Trigger) plus every last day in a Month (Monthly Trigger)

Features

  • Simple Structure and easy to use
  • Possible Triggers: OneTimeOnly, Daily, Weekly and Monthly
  • Monthly Trigger: DayOfMonth and Weekday
  • Collection of TriggerItems
  • Next Trigger-Date/Time Information
  • Check if a TriggerItem will fire on a certain Date CheckDate(DateTime date)
  • Combine different Triggers in one Item. (f.e. every Friday plus every last Day in a Month)
    If there is an overlap the Trigger fires only one time
  • Save and restore TriggerItems to and from XML

Settings

Field Description
StartDate Specifies the first Date on which the trigger will fire
EndDate Specifies the last Date on which the trigger will fire
TriggerTime Specifies the Time on which the trigger will fire
Enabled Enable / Disable the trigger
TriggerSettings Set the appropriate trigger-dates as described below

TriggerItem.TriggerSettings Overview:
TriggerSettings.jpg

To activate a specific Date just set the appropriate flag(s):

// Activate Sunday on weekly trigger.
triggerItem.TriggerSettings.Weekly.DaysOfWeek[(int)DayOfWeek.Sunday] = true;

// Activate last Friday in January and February
triggerItem.TriggerSettings.Monthly.Month[(int)TaskScheduler.MonthOfTheYeay.January] = 
    true; 
triggerItem.TriggerSettings.Monthly.Month[(int)TaskScheduler.MonthOfTheYeay.February] = 
    true; 
triggerItem.TriggerSettings.Monthly.DaysOfMonth[(int)TaskScheduler.DayOccurrence.Last] =
    true; 
triggerItem.TriggerSettings.Monthly.WeekDay[(int)DayOfWeek.Sunday] = true;

Using TaskScheduler and TriggerItems

  1. Create a new Instance of TaskScheduler.
    // Create the TaskScheduler
    TaskScheduler _taskScheduler = new TaskScheduler();
  2. Create a new Trigger-Item, set start and end date + trigger time and if you like a tag.
    TaskScheduler.TriggerItem triggerItem = new TaskScheduler.TriggerItem();
    triggerItem.Tag = textBoxlabelOneTimeOnlyTag.Text;
    triggerItem.StartDate = dateTimePickerStartDate.Value;
    triggerItem.EndDate = dateTimePickerEndDate.Value;
    triggerItem.TriggerTime = dateTimePickerTriggerTime.Value;
    // And the trigger-Event :)
    triggerItem.OnTrigger += new TaskScheduler.TriggerItem.OnTriggerEventHandler(
        triggerItem_OnTrigger);

    Settings for "OneTimeOnly"

    TriggerItem.TriggerSettings.OneTimeOnly.Active = checkBoxOneTimeOnlyActive.Checked;
    triggerItem.TriggerSettings.OneTimeOnly.Date = 
        dateTimePickerOneTimeOnlyDay.Value.Date;

    Settings for "Daily"

    triggerItem.TriggerSettings.Daily.Interval = (ushort)numericUpDownDaily.Value;

    Settings for "Weekly"

    for (byte day = 0; day < 7; day++) // Set the active Days
    triggerItem.TriggerSettings.Weekly.DaysOfWeek[day] = 
        checkedListBoxWeeklyDays.GetItemChecked(day);

    Settings for "Monthly"

    for (byte month = 0; month < 12; month++) // Set the active Months
        triggerItem.TriggerSettings.Monthly.Month[month] = 
        checkedListBoxMonthlyMonths.GetItemChecked(month);
    
    // Set the active Days (0..30 = Days, 31=last Day) for monthly trigger
    for (byte day = 0; day < 32; day++)
        triggerItem.TriggerSettings.Monthly.DaysOfMonth[day] = 
        checkedListBoxMonthlyDays.GetItemChecked(day);
    
    // Set the active weekNumber and DayOfWeek
    // f.e. the first monday, or the last friday...
    // 0..4: first, second, third, fourth or last week
    
    for (byte weekNumber = 0; weekNumber < 5; weekNumber++)     
        triggerItem.TriggerSettings.Monthly.WeekDay.WeekNumber[weekNumber] = 
        checkedListBoxMonthlyWeekNumber.GetItemChecked(weekNumber);
    for (byte day = 0; day < 7; day++)
        triggerItem.TriggerSettings.Monthly.WeekDay.DayOfWeek[day] = 
        checkedListBoxMonthlyWeekDay.GetItemChecked(day);
  3. Add the trigger to the Collection and enable the Scheduler
    triggerItem.Enabled = true; // Set the Item-Active - State
    _taskScheduler.AddTrigger(item); // Add the trigger to List
    _taskScheduler.Enabled = true; // Start the Scheduler

Disclaimer

THE SOFTWARE AND THE ACCOMPANYING FILES ARE DISTRIBUTED "AS IS" AND WITHOUT ANY WARRANTIES WHETHER EXPRESSED OR IMPLIED. NO REPONSIBILITIES FOR POSSIBLE DAMAGES OR EVEN FUNCTIONALITY CAN BE TAKEN. THE USER MUST ASSUME THE ENTIRE RISK OF USING THIS SOFTWARE.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Lothar Perr

Team Leader
Call-Data-Systems
Germany Germany

Member


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

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralGreat Job Pinmemberotakucrono13:20 20 Jul '10  
GeneralRe: Great Job PinmemberLothar Perr22:37 27 Jul '10  
GeneralRe: Great Job Pinmembervbytesdc10:48 3 Mar '11  
GeneralNice work ..plz help for my struggle Pinmemberskyramesh0:03 23 Jan '10  
GeneralRe: Nice work ..plz help for my struggle PinmemberLothar Perr6:25 3 Feb '10  
GeneralReally Nice article... PinmemberKushagra Tiwari3:49 7 Sep '09  
GeneralNice work PinmemberXmen W.K.15:42 7 Aug '09  
GeneralRe: Nice work PinmemberLothar Perr5:17 8 Aug '09  
GeneralRe: Nice work PinmemberDonsw17:20 21 Aug '09  
GeneralRe: Nice work PinmemberLothar Perr22:11 21 Aug '09  
GeneralNo discription of TaskScheduler class Pinmemberflow19659:14 5 Aug '09  
GeneralRe: No discription of TaskScheduler class PinmemberLothar Perr12:45 5 Aug '09  
You are right, a System.Timers.Timer is better in most cases...
I used the Forms.Timer because you don't need to invoke within the Event-Handler...
 
Replace the Timer and use following Event-Handler:
 
void triggerItem_OnTrigger(object sender, TaskScheduler.OnTriggerEventArgs e)
{
textBoxEvents.Invoke(new MethodInvoker(delegate
{
textBoxEvents.AppendText(e.TriggerDate.ToString() + ": " + e.Item.Tag + ", next trigger: " + e.Item.GetNextTriggerTime().DayOfWeek.ToString() + ", " + e.Item.GetNextTriggerTime().ToString() + "\r\n");
UpdateTaskList();
}));
}
GeneralSuggestion [modified] PingroupHasan Hyder8:09 4 Aug '09  
GeneralRe: Suggestion PinmemberLothar Perr9:15 4 Aug '09  
GeneralMy vote of 2 PinmemberCountry Man5:20 4 Aug '09  
RantRe: My vote of 2 PinPopularmemberjgauffin5:49 4 Aug '09  
GeneralRe: My vote of 2 PinPopularmemberLothar Perr8:55 4 Aug '09  
GeneralMy vote of 5 PinmemberSpiff Dog11:11 4 Aug '09  
GeneralRe: My vote of 2 PinmemberXmen W.K.15:39 7 Aug '09  
GeneralWe have done one of these for work, and I know what this feels like PinmvpSacha Barber22:38 2 Aug '09  
GeneralRe: We have done one of these for work, and I know what this feels like PinmemberLothar Perr9:14 4 Aug '09  
Generalnice Pinmemberpimb28:02 28 Jul '09  
GeneralRe: nice PinmemberLothar Perr8:27 28 Jul '09  

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

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web01 | 2.5.120210.1 | Last Updated 28 Jul 2009
Article Copyright 2009 by Lothar Perr
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid