亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Asp.Net(C#)自動(dòng)執(zhí)行計(jì)劃任務(wù)的程序?qū)嵗治?/h1>
系統(tǒng) 3222 0

在業(yè)務(wù)復(fù)雜的應(yīng)用程序中,有時(shí)候會(huì)要求一個(gè)或者多個(gè)任務(wù)在一定的時(shí)間或者一定的時(shí)間間隔內(nèi)計(jì)劃進(jìn)行,比如定時(shí)備份或同步數(shù)據(jù)庫(kù),定時(shí)發(fā)送電子郵件等,我們稱之為計(jì)劃任務(wù)。實(shí)現(xiàn)計(jì)劃任務(wù)的方法也有很多,可以采用SQLAgent執(zhí)行存儲(chǔ)過程來實(shí)現(xiàn),也可以采用Windows任務(wù)調(diào)度程序來實(shí)現(xiàn),也可以使用Windows服務(wù)來完成我們的計(jì)劃任務(wù),這些方法都是很好的解決方案。但是,對(duì)于Web應(yīng)用程序來說,這些方法實(shí)現(xiàn)起來并不是很簡(jiǎn)單的,主機(jī)服務(wù)提供商或者不能直接提供這樣的服務(wù),或者需要你支付許多額外的費(fèi)用。 本文就介紹一個(gè)直接在Web應(yīng)用程序中使用的簡(jiǎn)單的方法,這個(gè)方法不需要任何額外的配置即可輕松實(shí)現(xiàn)。
  由于ASP.NET站點(diǎn)是作為Web應(yīng)用程序運(yùn)行的,它并不受線程的限制,因此我們可以非常方便地在Application_Start和Application_End事件中建立和銷毀一個(gè)計(jì)劃任務(wù)。下面就簡(jiǎn)單介紹一下在Web站點(diǎn)實(shí)現(xiàn)計(jì)劃任務(wù)的方法。我們的例子是定時(shí)往文件里添加信息,作為例子,這里把當(dāng)前的時(shí)間定時(shí)地寫入文件中。
  一個(gè)計(jì)劃任務(wù)的工作單元稱之為一個(gè)任務(wù)(Job),下面的代碼描述了對(duì)所有任務(wù)都可以被調(diào)度引擎計(jì)劃執(zhí)行的一個(gè)通用的接口,這里的每個(gè)任務(wù)實(shí)現(xiàn)了Execute方法,供調(diào)度引擎進(jìn)行調(diào)用:

      
        1
      
      
        public
      
      
        interface
      
      
         ISchedulerJob

      
      
        2
      
      
            {

      
      
        3
      
      
        void
      
      
         Execute();

      
      
        4
      
           }
    

  如前所述,我們的例子是實(shí)現(xiàn)往文件寫如字符日期,下面就是實(shí)現(xiàn)這一任務(wù)的方法:

      
         1
      
      
        public
      
      
        class
      
      
         SampleJob : ISchedulerJob 

      
      
         2
      
      
        { 

      
      
         3
      
      
        public
      
      
        void
      
      
         Execute() 

      
      
         4
      
      
        { 

      
      
         5
      
      
        //
      
      
        文件保存的物理路徑,CSTest為虛擬目錄名稱,F(xiàn):\Inetpub\wwwroot\CSTest為物理路徑 
      
      
         6
      
      
        string
      
       p = 
      
        @"C:\Users\Jack\Desktop\AutoRun\AutoRun
      
      
        "
      
      
        ; 

      
      
         7
      
      
        //
      
      
        我們?cè)谔摂M目錄的根目錄下建立SchedulerJob文件夾,并設(shè)置權(quán)限為匿名可修改, 

      
      
         8
      
      
        //
      
      
        SchedulerJob.txt就是我們所寫的文件 
      
      
         9
      
      
        string
      
       FILE_NAME = p+ 
      
        "
      
      
        \\SchedulerJob\\SchedulerJob.txt
      
      
        "
      
      
        ; 

      
      
        10
      
      
        //
      
      
        取得當(dāng)前服務(wù)器時(shí)間,并轉(zhuǎn)換成字符串 
      
      
        11
      
      
        string
      
       c = System.DateTime.Now.ToString(
      
        "
      
      
        yyyy-mm-dd hh:MM:ss
      
      
        "
      
      
        ); 

      
      
        12
      
      
        //
      
      
        標(biāo)記是否是新建文件的標(biāo)量 
      
      
        13
      
      
        bool
      
       flag = 
      
        false
      
      
        ; 

      
      
        14
      
      
        //
      
      
        如果文件不存在,就新建該文件 
      
      
        15
      
      
        if
      
       (!
      
        File.Exists(FILE_NAME)) 

      
      
        16
      
      
        { 

      
      
        17
      
       flag = 
      
        true
      
      
        ; 

      
      
        18
      
       StreamWriter sr =
      
         File.CreateText(FILE_NAME); 

      
      
        19
      
      
        sr.Close(); 

      
      
        20
      
      
        } 

      
      
        21
      
      
        //
      
      
        向文件寫入內(nèi)容 
      
      
        22
      
       StreamWriter x = 
      
        new
      
       StreamWriter(FILE_NAME,
      
        true
      
      
        ,System.Text.Encoding.Default); 

      
      
        23
      
      
        if
      
      (flag) x.Write(
      
        "
      
      
        計(jì)劃任務(wù)測(cè)試開始:
      
      
        "
      
      
        ); 

      
      
        24
      
       x.Write(
      
        "
      
      
        \r\n
      
      
        "
      
      +
      
        c); 

      
      
        25
      
      
        x.Close(); 

      
      
        26
      
      
        } 

      
      
        27
      
       } 
    

  接下來,我們建立一個(gè)配置對(duì)象,告訴調(diào)度引擎執(zhí)行什么任務(wù)和執(zhí)行的時(shí)間間隔。

      
         1
      
      
        public
      
      
        class
      
      
         SchedulerConfiguration 

      
      
         2
      
      
        { 

      
      
         3
      
      
        //
      
      
        時(shí)間間隔 
      
      
         4
      
      
        private
      
      
        int
      
      
         sleepInterval; 

      
      
         5
      
      
        //
      
      
        任務(wù)列表 
      
      
         6
      
      
        private
      
       ArrayList jobs = 
      
        new
      
      
         ArrayList(); 

      
      
         7
      
      
         8
      
      
        public
      
      
        int
      
       SleepInterval { 
      
        get
      
       { 
      
        return
      
      
         sleepInterval; } } 

      
      
         9
      
      
        public
      
       ArrayList Jobs { 
      
        get
      
       { 
      
        return
      
      
         jobs; } } 

      
      
        10
      
      
        11
      
      
        //
      
      
        調(diào)度配置類的構(gòu)造函數(shù) 
      
      
        12
      
      
        public
      
       SchedulerConfiguration(
      
        int
      
      
         newSleepInterval) 

      
      
        13
      
      
        { 

      
      
        14
      
       sleepInterval =
      
         newSleepInterval; 

      
      
        15
      
      
        } 

      
      
        16
      
      
        } 

      
      
        17
      
      
        18
      
      
        下面就是調(diào)度引擎,定時(shí)執(zhí)行配置對(duì)象的任務(wù) 

      
      
        19
      
      
        20
      
      
        public
      
      
        class
      
      
         Scheduler 

      
      
        21
      
      
        { 

      
      
        22
      
      
        private
      
       SchedulerConfiguration configuration = 
      
        null
      
      
        ; 

      
      
        23
      
      
        24
      
      
        public
      
      
         Scheduler(SchedulerConfiguration config) 

      
      
        25
      
      
        { 

      
      
        26
      
       configuration =
      
         config; 

      
      
        27
      
      
        } 

      
      
        28
      
      
        29
      
      
        public
      
      
        void
      
      
         Start() 

      
      
        30
      
      
        { 

      
      
        31
      
      
        while
      
      (
      
        true
      
      
        ) 

      
      
        32
      
      
        { 

      
      
        33
      
      
        //
      
      
        執(zhí)行每一個(gè)任務(wù) 
      
      
        34
      
      
        foreach
      
      (ISchedulerJob job 
      
        in
      
      
         configuration.Jobs) 

      
      
        35
      
      
        { 

      
      
        36
      
       ThreadStart myThreadDelegate = 
      
        new
      
      
         ThreadStart(job.Execute); 

      
      
        37
      
       Thread myThread = 
      
        new
      
      
         Thread(myThreadDelegate); 

      
      
        38
      
      
        myThread.Start(); 

      
      
        39
      
      
        Thread.Sleep(configuration.SleepInterval); 

      
      
        40
      
      
        } 

      
      
        41
      
      
        } 

      
      
        42
      
      
        } 

      
      
        43
      
       } 
    

  所有的準(zhǔn)備工作已經(jīng)完成,下面就是激活引擎的工作了。為了讓我們的任務(wù)計(jì)劃執(zhí)行,我們?cè)贕lobal.asax.cs文件里的Applicatio_Start和Application_End里進(jìn)行建立和銷毀工作,首先建立一個(gè)調(diào)度進(jìn)程運(yùn)行的線程,我們這里的運(yùn)行間隔時(shí)間為3秒鐘。

      
         1
      
      
        public
      
       System.Threading.Thread schedulerThread = 
      
        null
      
      
        ; 

      
      
         2
      
      
        protected
      
      
        void
      
      
         Application_Start(Object sender, EventArgs e) 

      
      
         3
      
      
        { 

      
      
         4
      
       SchedulerConfiguration config = 
      
        new
      
       SchedulerConfiguration(
      
        1000
      
      *
      
        3
      
      
        ); 

      
      
         5
      
       config.Jobs.Add(
      
        new
      
      
         SampleJob()); 

      
      
         6
      
       Scheduler scheduler = 
      
        new
      
      
         Scheduler(config); 

      
      
         7
      
       System.Threading.ThreadStart myThreadStart = 
      
        new
      
      
         System.Threading.ThreadStart(scheduler.Start); 

      
      
         8
      
       System.Threading.Thread schedulerThread = 
      
        new
      
      
         System.Threading.Thread(myThreadStart); 

      
      
         9
      
      
        schedulerThread.Start(); 

      
      
        10
      
       } 
    

  最后還需要在程序退出時(shí)進(jìn)行銷毀:

      
        1
      
      
        protected
      
      
        void
      
      
         Application_End(Object sender, EventArgs e) 

      
      
        2
      
      
        { 

      
      
        3
      
      
        if
      
       (
      
        null
      
       !=
      
         schedulerThread) 

      
      
        4
      
      
        { 

      
      
        5
      
      
        schedulerThread.Abort(); 

      
      
        6
      
      
        } 

      
      
        7
      
       } 
    

  好了,在VS.NET里建立一個(gè)C#的Web應(yīng)用程序工程,建立TaskScheduler.cs類,并修改相應(yīng)的Global.asax.cs文件。為了能看到效果,我們?cè)俳⒁粋€(gè)表單WebForm1.aspx,定時(shí)刷新來檢查我們所記錄的數(shù)據(jù):

      
         1
      
       <%@ Page language=
      
        "
      
      
        c#
      
      
        "
      
       Codebehind=
      
        "
      
      
        WebForm1.aspx.cs
      
      
        "
      
       AutoEventWireup=
      
        "
      
      
        false
      
      
        "
      
      
         2
      
       Inherits=
      
        "
      
      
        CSTest.WebForm1
      
      
        "
      
       %> 

      
         3
      
       <!DOCTYPE HTML PUBLIC 
      
        "
      
      
        -//W3C//DTD HTML 4.0 Transitional//EN
      
      
        "
      
       > 

      
         4
      
       <HTML> 

      
         5
      
       <HEAD> 

      
         6
      
       <title>在Web應(yīng)用程序中執(zhí)行計(jì)劃任務(wù)的例子</title> 

      
         7
      
       <meta http-equiv=
      
        "
      
      
        refresh
      
      
        "
      
       content=
      
        "
      
      
        10
      
      
        "
      
      > 

      
         8
      
       <meta name=
      
        "
      
      
        GENERATOR
      
      
        "
      
       Content=
      
        "
      
      
        Microsoft Visual Studio 7.0
      
      
        "
      
      > 

      
         9
      
       <meta name=
      
        "
      
      
        CODE_LANGUAGE
      
      
        "
      
       Content=
      
        "
      
      
        C#
      
      
        "
      
      > 

      
        10
      
       <meta name=
      
        "
      
      
        vs_defaultClientScript
      
      
        "
      
       content=
      
        "
      
      
        JavaScript
      
      
        "
      
      > 

      
        11
      
       <meta name=
      
        "
      
      
        vs_targetSchema
      
      
        "
      
       content=
      
        "
      
      
        http://schemas.microsoft.com/intellisense/ie5
      
      
        "
      
      > 

      
        12
      
       </HEAD> 

      
        13
      
       <body MS_POSITIONING=
      
        "
      
      
        GridLayout
      
      
        "
      
      > 

      
        14
      
       <form id=
      
        "
      
      
        Form1
      
      
        "
      
       method=
      
        "
      
      
        post
      
      
        "
      
       runat=
      
        "
      
      
        server
      
      
        "
      
      > 

      
        15
      
       <iframe style=
      
        "
      
      
        width:100%;height:100%
      
      
        "
      
       src=
      
        "
      
      
        SchedulerJob/SchedulerJob.txt
      
      
        "
      
      ></iframe> 

      
        16
      
       </form> 

      
        17
      
       </body> 

      
        18
      
       </HTML>
      
      
    

  對(duì)工程進(jìn)行編譯并運(yùn)行,就可以看到結(jié)果了,結(jié)果如下:

計(jì)劃任務(wù)測(cè)試開始:
2003-13-10 11:08:15
2003-13-10 11:08:18
2003-13-10 11:08:21
2003-13-10 11:08:24
2003-13-10 11:08:27
2003-13-10 11:08:30

  需要說明的是,以上只是在Web應(yīng)用程序中執(zhí)行計(jì)劃任務(wù)的簡(jiǎn)單例子,對(duì)于多個(gè)任務(wù)來說,需要在不同的線程內(nèi)進(jìn)行工作,對(duì)計(jì)劃的安排也是很簡(jiǎn)單的,實(shí)際還需要站點(diǎn)堵塞,當(dāng)機(jī)的情況。另外這里也沒有進(jìn)行錯(cuò)誤的處理等工作,相信大家會(huì)寫出更加完美的代碼的。

點(diǎn)擊下載源碼: http://files.cnblogs.com/zhaoxuntao/AutoRun.zip


資源回收,當(dāng)web沒有人訪問的時(shí)候,定時(shí)器會(huì)回收停掉
不知道在 Application_End 時(shí)自動(dòng)訪問一次有用么,我這前測(cè)試了幾天這個(gè)方法都可以行。
void Application_End(object sender, EventArgs e)
{
///在應(yīng)用程序關(guān)閉時(shí)運(yùn)行的代碼
webSocket.Stop();
Thread.Sleep(15000);
try
{
string url = " http://127.0.0.1/404.aspx?mater=" + DateTime.Now.Ticks;
HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
using (HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse())
{
Stream resStream = response.GetResponseStream();
}
}
catch (Exception ex)
{
//異常時(shí),等15s,再訪問一次。
Thread.Sleep(15000);
string url = " http://127.0.0.1/404.aspx?mater=" + DateTime.Now.Ticks;
HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
using (HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse())
{
Stream resStream = response.GetResponseStream();
}

Hangjing.AppLog.AppLog.Error("Application_End:" + ex);
}

}


-->

更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 999热这里只有精品 999人在线精品播放视频 | 亚洲综合色婷婷中文字幕 | 手机看片日韩日韩韩 | 老潮湿影院免费体验区 | 久久久99精品久久久久久 | 国产免费一区二区三区在线 | 色费女人18毛片a级视频在线 | 亚洲在线视频免费 | 国产91成人精品亚洲精品 | 天啪天干在线视频 | 九色福利视频 | 久久国产亚洲精品麻豆 | 18视频在线观看 | 国产欧美精品一区二区三区-老狼 | 久久综合九色综合77 | 综合啪啪 | 99re这里只有精品国产精品 | 欧美成人aa大片拍拍拍 | 亚欧成人一区二区 | 日韩免费福利视频 | 96精彩视频在线观看 | 日韩中文在线 | 四虎国产永久在线精品免费观看 | 波多野结衣久久高清免费 | 国产人伦视频在线观看 | 国产亚洲福利精品一区 | 欧美一级看片a免费观看 | 亚洲欧美综合一区二区三区四区 | 久久美女精品 | 亚洲免费片 | 精品国产乱码久久久久久浪潮 | 精品久久久久久国产 | 日本亚洲a | 呦呦精品| 免费一级欧美毛片 | 日韩精品综合 | 国产羞羞事1000部在线观看 | 男人天堂免费 | 欧美第3页 | 久草视频新 | 欧美成人午夜视频在线观看 |