Asp.Net(C#)自動実行計画タスクのプログラムインスタンス分析
18300 ワード
ビジネスが複雑なアプリケーションでは、定期的なバックアップやデータベースの同期、電子メールの定期的な送信など、1つ以上のタスクを一定の時間または一定の時間間隔で計画する必要がある場合があります.これを計画タスクと呼びます.計画タスクを実現する方法もたくさんあります.SQLAgentでストレージプロセスを実行して実現したり、Windowsタスクスケジューラを採用して実現したり、Windowsサービスを使用して計画タスクを完成したりすることができます.これらの方法は良い解決策です.しかし、Webアプリケーションでは、これらの方法は簡単ではありません.ホストサービスプロバイダは、このようなサービスを直接提供できないか、追加の費用を支払う必要があります.Webアプリケーションで直接使用する簡単な方法について説明します.この方法は、追加の構成を必要とせずに簡単に実現できます.ASP.NETサイトはWebアプリケーションとして実行されており、スレッドに制限されていないため、Application_StartとApplication_Endイベントで計画タスクを確立および破棄します.Webサイトで計画タスクを実現する方法を簡単に紹介します.我々の例は,定期的にファイルに情報を追加する例であり,ここでは現在の時間を定期的にファイルに書き込む.1つの計画タスクの作業ユニットは1つのタスク(Job)と呼ばれ、以下のコードはすべてのタスクをスケジューリングエンジンによって計画的に実行できる共通のインタフェースを説明し、ここで各タスクはExecuteメソッドを実現し、スケジューリングエンジンによって呼び出される.
前述したように、私たちの例は、文字の日付のようなファイルへの書き込みを実現することです.次に、このタスクを実現する方法を示します.
次に、スケジューリングエンジンがどのタスクを実行するかと実行する間隔を示す構成オブジェクトを作成します.
すべての準備が完了しました.次はエンジンをアクティブにする作業です.私たちの任務計画を実行するためにGlobalにいます.asax.csファイルのApplicatio_StartとApplication_Endでは作成と破棄を行い、まずスケジューリングプロセスの実行スレッドを作成します.ここでの実行間隔は3秒です.
最後に、プログラムの終了時に破棄する必要があります.
さて、VS.NETでC#のWebアプリケーションエンジニアリングを構築し、TaskSchedulerを構築します.csクラスを変更し、対応するGlobalを変更します.asax.csファイル.効果を見るためにフォームWebForm 1を作成します.aspx、タイミングリフレッシュで記録されたデータを確認します.
プロジェクトをコンパイルして実行すると、結果は以下の通りです.結果は以下の通りです.計画タスクテスト開始: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アプリケーションで計画タスクを実行する簡単な例にすぎません.複数のタスクにとって、異なるスレッド内で作業する必要があります.計画の手配も簡単で、実際にはサイトが詰まっていて、その場にいる場合も必要です.また、ここではエラー処理などの作業も行われておらず、より完璧なコードが書けると信じています.
クリックしてソースをダウンロード:http://files.cnblogs.com/zhaoxuntao/AutoRun.zip
1 public interface ISchedulerJob
2 {
3 void Execute();
4 }
前述したように、私たちの例は、文字の日付のようなファイルへの書き込みを実現することです.次に、このタスクを実現する方法を示します.
1 public class SampleJob : ISchedulerJob
2 {
3 public void Execute()
4 {
5 // ,CSTest ,F:\Inetpub\wwwroot\CSTest
6 string p = @"C:\Users\Jack\Desktop\AutoRun\AutoRun";
7 // SchedulerJob , ,
8 //SchedulerJob.txt
9 string FILE_NAME = p+ "\\SchedulerJob\\SchedulerJob.txt";
10 // ,
11 string c = System.DateTime.Now.ToString("yyyy-mm-dd hh:MM:ss");
12 //
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 //
22 StreamWriter x = new StreamWriter(FILE_NAME,true,System.Text.Encoding.Default);
23 if(flag) x.Write(" :");
24 x.Write("\r
"+c);
25 x.Close();
26 }
27 }
次に、スケジューリングエンジンがどのタスクを実行するかと実行する間隔を示す構成オブジェクトを作成します.
1 public class SchedulerConfiguration
2 {
3 //
4 private int sleepInterval;
5 //
6 private ArrayList jobs = new ArrayList();
7
8 public int SleepInterval { get { return sleepInterval; } }
9 public ArrayList Jobs { get { return jobs; } }
10
11 //
12 public SchedulerConfiguration(int newSleepInterval)
13 {
14 sleepInterval = newSleepInterval;
15 }
16 }
17
18 ,
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 //
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 }
すべての準備が完了しました.次はエンジンをアクティブにする作業です.私たちの任務計画を実行するためにGlobalにいます.asax.csファイルのApplicatio_StartとApplication_Endでは作成と破棄を行い、まずスケジューリングプロセスの実行スレッドを作成します.ここでの実行間隔は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 }
最後に、プログラムの終了時に破棄する必要があります.
1 protected void Application_End(Object sender, EventArgs e)
2 {
3 if (null != schedulerThread)
4 {
5 schedulerThread.Abort();
6 }
7 }
さて、VS.NETでC#のWebアプリケーションエンジニアリングを構築し、TaskSchedulerを構築します.csクラスを変更し、対応するGlobalを変更します.asax.csファイル.効果を見るためにフォームWebForm 1を作成します.aspx、タイミングリフレッシュで記録されたデータを確認します.
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 </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>
プロジェクトをコンパイルして実行すると、結果は以下の通りです.結果は以下の通りです.計画タスクテスト開始: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アプリケーションで計画タスクを実行する簡単な例にすぎません.複数のタスクにとって、異なるスレッド内で作業する必要があります.計画の手配も簡単で、実際にはサイトが詰まっていて、その場にいる場合も必要です.また、ここではエラー処理などの作業も行われておらず、より完璧なコードが書けると信じています.
クリックしてソースをダウンロード:http://files.cnblogs.com/zhaoxuntao/AutoRun.zip