TaskScheduler

Ağustos 13, 2008

Windows servisleri ile belirli bir zaman aralığında çalıştırmak istediğimiz işlemleri ya da programları çalıştırabiliriz. Ama bunu Webde nasıl yapabiliriz ? Web Application çalıştığı süre içinde belirli görevleri belirleyip zamanı gelince bu görevleri yerine nasıl  getiririz? Bu tip bir istek Web uygulamamız içinde belirli bir zaman aralığında çalışıp yapması gereken işleri yapıp tekrar bir sonraki işlem zamanına kadar beklemesini istersek nasıl bir şey yapabiliriz.

Aslında bu işlemi WindowsService üzerinden yapabiliriz. Ama bu servisleri hostta kurmak , programının Web uygulamasından alması gereken verileri alması gibi dertler ile uğraşmak zorunda kalırız. Bu dertlerden kurtulacak başka bir yol var mı acaba? Evet bir yol var. Global.asax ve ApplicationOn_Start() methodunu kullanarak ve bir Task classını yazarak bu işe yapabiliriz.Benim istediğim doğum günü olan üyelerimin doğum günlerini otomatik olarak onlara mail atarak kutlamak…

Aşağıda Task.cs ve TaskScheduler.cs classlarını Web uygulamamıza ekledikten sonra Global.asax ta bunu çalıştırısanız. istediğiniz zaman aralığında istediğiniz methodları çalıştırır ve istediğiniz ,işlemleri yaptırabilirsiniz. Ben 1 günde bir mail atılması gerekenlere mail atılması üzerine tasarladım.

Task.cs classımız;
using System;
using System.Collections;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Timers;
using System.Threading;
using System.IO;

namespace TaskScheduler{

/// <summary>
///Summary description for Task
///</summary>

public class Task{

System.Timers.Timer timer = null;

MailManager mailManager = new MailManager();
#region Properties

private string _name;
private bool _isRunning;
private DateTime _lastRunTime;
private bool _isLastRunSuccessful;
private double _interval;
private bool _stopped;

public bool Stopped{
get { return _stopped; }
set { _stopped = value; }
}

public double Interval{
get { return _interval; }
set { _interval = value; }
}
public bool IsLastRunSuccessful{
get { return _isLastRunSuccessful; }
set { _isLastRunSuccessful = value; }
}

public DateTime LastRunTime{
get { return _lastRunTime; }
set { _lastRunTime = value ; }
}

public bool IsRunning{
get { return _isRunning; }
set { _isRunning = value ; }
}

public string Name{
get { return _name; }
set { _name = value ; }
}

#endregion

public Task(double interval){
this.Interval = interval;
this.Initialize();
}
#region Public Methods

public void Start(){
this.Stopped = false;
this.StartTask();
}
public void Stop(){
this.Stopped = true;
}
#endregion

private void Initialize(){
this.Stopped = false;
timer = new System.Timers.Timer(this.Interval);
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
timer.Enabled = true;
}
private void StartTask(){
if (!this.Stopped){
Thread thread = new Thread(new ThreadStart(Execute));
thread.Start();
}

}
private void Execute(){
try{

ArrayList arMailList = new ArrayList();
arMailList = mailManager.GetMailList();

if(arMailList.Count != 0)
 foreach (string mailTo in arMailList){
  string mailSubject = “Mutlu yıllar.”;
  string mailBody = “İyi ki dogdun. Mutlu yıllar”;
  Notification.SendMail(“mail@yoursite.com“, mailTo, mailSubject, mailBody);
 }
this.IsRunning = true;
}
catch
{
this.IsLastRunSuccessful = false;
// Handle the exception
}

finally{
this.IsRunning = false;
}

}
 

void timer_Elapsed(object sender, ElapsedEventArgs e){
 
if (!this.IsRunning)
StartTask();

}

}

}
 TaskSchedular.cs classı da Task işlemini başlatıyor.

 

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Timers;
using System.Threading;
using System.IO;

namespace  TaskScheduler{

public class TaskScheduler
{

#region Fieldss

Task task = null;
#endregion

#region Public Constructors

public TaskScheduler(){
Initialize();

}

#endregion

#region Public Methods
public void StartTask(){
this.task.Start();
}
public void StopTask(){
this.task.Stop();
}

#endregion

#region Public Constructors
private void Initialize(){
this.task = new Task(86400000);  // 24 hours
}

#endregion

}

}
 

Birde Global.asax ta ;
TaskScheduler.TaskScheduler taskScheduler = new TaskScheduler.TaskScheduler();
void Application_Start(object sender, EventArgs e)

{

this.taskScheduler.StartTask();

}

ekledikten sonra Database kısmında gerekli işlemleri yapan methodu Task.Execute() methodunun içinde çağırararak o methodun 24 saatte bir çalışmasını sağlamış oluruz.

Not: Task.cs ve TaskSchedular classlar  http://nayyeri.net/blog/how-to-build-a-task-scheduler-system-for-the-asp.net-ndash-part-2/ adresinde c# 3.0 ile yazılmıs şeklini c# 2.0 göre düzenlendi. İsteyenler burdan da kodlara bakabilir. Güzel bir referans.

Herkese iyi çalışmalar. Paylaşmak Güzeldir.:))