C#通過線程完成定時執行事件


          軟件中經常有定時執行的操作,比如銀行需要定時計算利息,客戶合同到期需要定時自動發送短信或者郵件提醒,這些如果通過人工操作是一個很大的任務量,不太切合實際,所以需要考慮讓系統自動完成操作,方法很多,比如數據庫的定時作業,window組件等都可以實現,在這里我們使用另外一種方式,C#線程來完成:

        首先定義一個接口(ISchedulerJob),用來標准化事件的任務

      

View Code
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;

///   <summary>
/// ISchedulerJob 的摘要說明
///   </summary>
public  interface ISchedulerJob
{
     void Execute();
}

 

然后定義任務類實現接口

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.Text;
using System.Data.SqlClient;
using JH.BLL;
using JH.Model;

///   <summary>
/// SampleJob 的摘要說明
///   </summary>
public  class SampleJob : ISchedulerJob
{
     public SampleJob()
    {
         //
        
// TODO: 在此處添加構造函數邏輯
        
//
    }

     #region ISchedulerJob 成員


     public  void Execute()
    {
         string today = DateTime.Now.ToString( " MM-dd HH:mm:ss ");
         try
        {
             // 獲取所有用戶
            
// 如果時間處在下面的四個時間點,將會執行定義的任務 
             if (today ==  " 03-20 00:20:00 " || today ==  " 06-20 00:20:00 " || today ==  " 09-20 00:20:00 " || today ==  " 12-20 00:20:00 ")
            {
                  //任務
                         }
                        }
                    }
                }
            }
        }
         catch (Exception ee)
        {
             throw  new Exception(ee.Message);
        }
    }
     #endregion
}

如果有多個任務,可以多定義幾個

 

然后在一個類用來將任務整合到一起,並設其他要用到的參數

 

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.Collections;

///   <summary>
/// SchedulerConfiguration 的摘要說明
///   </summary>
public  class SchedulerConfiguration
{

     // 時間間隔
     private  int sleepInterval;
     // 任務列表
     private ArrayList jobs =  new ArrayList();

     public  int SleepInterval {  get {  return sleepInterval; } }
     public ArrayList Jobs {  get {  return jobs; } }


     public SchedulerConfiguration( int newSleepInterval)
    {
        sleepInterval = newSleepInterval;
    }
}

 

再次開始執行任務

 

View Code
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.Threading;

///   <summary>
/// Scheduler 的摘要說明
///   </summary>
public  class Scheduler
{
     private SchedulerConfiguration configuration =  null;
     public Scheduler(SchedulerConfiguration config)
    {
         //
        
// TODO: 在此處添加構造函數邏輯
        
//
        configuration = config;
    }
     public  void Start()
    {
         while ( true)
        {
             // 執行每一個任務
             foreach (ISchedulerJob job  in configuration.Jobs)
            {
                ThreadStart myThreadDelegate =  new ThreadStart(job.Execute);
                Thread myThread =  new Thread(myThreadDelegate);
                myThread.Start();
                Thread.Sleep(configuration.SleepInterval);
            }
        }
    }
}

最后,這些都定義好了,我們需要通過線程不斷去觸發,可以再服務啟動的時候就開始執行,我們添加一個全局應用程序Global.asax

 

<%@ Application Language= " C# " %>
<%@ Import Namespace= "  System.Data " %>
<%@ Import Namespace= "  JH.BLL " %>
<%@ Import Namespace= " JH.Model " %>
<%@ Import Namespace= " System.Data.SqlClient " %>
<%@ Import Namespace= " JH.Common " %>
<script runat= " server ">
     public System.Threading.Thread schedulerThread =  null;
     void Application_Start( object sender, EventArgs e) 
    {
        DateTime today = DateTime.Now;

        SchedulerConfiguration config =  new SchedulerConfiguration( 1000);

      
        config.Jobs.Add( new SampleJob());
        Scheduler scheduler =  new Scheduler(config);
        System.Threading.ThreadStart myThreadStart =  new System.Threading.ThreadStart(scheduler.Start);
        System.Threading.Thread schedulerThread =  new System.Threading.Thread(myThreadStart);
        schedulerThread.Start();
         // }
    }
     void Application_End( object sender, EventArgs e) 
    {
         // 在應用程序關閉時,終止線程的進行
         if ( null != schedulerThread)
        {
            schedulerThread.Abort();
        }

    }
        
     void Application_Error( object sender, EventArgs e) 
    { 
         // 在出現未處理的錯誤時運行的代碼

    }

     void Session_Start( object sender, EventArgs e) 
    {
         // 在新會話啟動時運行的代碼

    }

     void Session_End( object sender, EventArgs e) 
    {
         // 在會話結束時運行的代碼。 
        
//  注意: 只有在 Web.config 文件中的 sessionstate 模式設置為
        
//  InProc 時,才會引發 Session_End 事件。如果會話模式 
        
// 設置為 StateServer 或 SQLServer,則不會引發該事件。

    }
       
</script>

這個時候,程序在1秒鍾就會自動通過線程去監聽,保證到定義的時間點去執行任務


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM