Asp.Net(C葃)計画タスクを自動実行するプログラムの実例分析共有


業務が複雑なアプリケーションでは、一定の時間または一定の時間間隔で、定期的にデータベースのバックアップや同期、定期的に電子メールを送るなどのタスクが要求される場合があります。計画的なタスクを実現する方法もたくさんあります。SQLAgentを使ってストレージプロセスを実行して実現することができます。Windowsタスクスケジューリングプログラムを使って実現することもできます。Windowsサービスを使って私たちの計画的なタスクを達成することもできます。これらの方法はすべて良い解決策です。しかし、これらの方法は、Webアプリケーションにとっては簡単ではない。ホストサービスプロバイダは、直接にこのようなサービスを提供できないか、あるいは多くの追加料金を支払う必要がある。本稿では、直接Webアプリケーションで使用する簡単な方法を紹介します。この方法は、追加の構成を必要とせずに簡単に実現できます。
ASP.NETサイトはWebアプリケーションとして動作していますので、スレッドによって制限されていませんので、Applicationで非常に便利です。StartとApplication_Endイベントで計画的なタスクを作成し、廃棄します。Webサイトで計画的なタスクを実現する方法を簡単に紹介します。私たちの例は、タイミングを決めてファイルに情報を追加し、例として、ここで現在の時間をタイミングよくファイルに書き込みます。
スケジュールタスクの動作ユニットをタスク(Job)と呼び、以下のコードは、すべてのタスクをスケジューリングエンジン計画によって実行できる汎用インターフェースを説明しています。ここでは、各タスクはExecute方法を実現し、スケジューリングエンジンの呼び出しに使用されます。

public interface ISchedulerJob
{
void Execute();
}
前に述べたように、私達の例は文字の日付のようにファイルに書くことです。以下はこのタスクを実現する方法です。

public class SampleJob : ISchedulerJob
{
public void Execute()
{
// ,CSTest ,F:\Inetpub\wwwroot\CSTest
string p = @"F:\Inetpub\wwwroot\CSTest";
// SchedulerJob , ,
//SchedulerJob.txt
string FILE_NAME = p+ "\\SchedulerJob\\SchedulerJob.txt";
// ,
string c = System.DateTime.Now.ToString("yyyy-mm-dd hh:MM:ss");
//
bool flag = false;
// ,
if (!File.Exists(FILE_NAME))
{
flag = true;
StreamWriter sr = File.CreateText(FILE_NAME);
sr.Close();
}
//
StreamWriter x = new StreamWriter(FILE_NAME,true,System.Text.Encoding.Default);
if(flag) x.Write(" :");
x.Write("\r
"+c);
x.Close();
}
}
次に、どのようなタスクと実行の時間間隔をスケジュールエンジンに通知する設定オブジェクトを作成します。

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;
}
}

以下はスケジュールエンジンで、タイミングに設定対象のタスクを実行します。

public class Scheduler
{
private SchedulerConfiguration configuration = null;

public Scheduler(SchedulerConfiguration config)
{
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.csファイルの中のApplicatioStartとApplication_Endでは、作成と廃棄作業を行い、まずスケジュールプロセスを実行するスレッドを作成します。ここでの運行間隔は3秒です。

public System.Threading.Thread schedulerThread = null;
protected void Application_Start(Object sender, EventArgs e)
{
SchedulerConfiguration config = new SchedulerConfiguration(1000*3);
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();
}
最後にプログラム終了時に廃棄する必要があります。

protected void Application_End(Object sender, EventArgs e)
{
if (null != schedulerThread)
{
schedulerThread.Abort();
}
}
はい、VSL.NETにC萼のWebアプリケーションプロジェクトを創立して、Taskcheduler.cs種類を創立して、そして対応するGlobal.asax.csファイルを修正します。効果を見るために、私達はもう一つのフォームを作ります。WebForm 1.aspx、タイムオーバーで私達が記録したデータを確認します。

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false"
Inherits="CSTest.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title> Web </title>
<meta http-equiv="refresh" content="10">
<meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<iframe style="width:100%;height:100%" src="SchedulerJob/SchedulerJob.txt"></iframe>
</form>
</body>
</HTML>
プロジェクトをコンパイルして実行すると、結果が見られます。
計画タスクテスト開始:2007-3-10 11:08:15 2009-3-10 11:08:18 2003-10 11:08:21 2009-3-10 11:08:24 2003-10 11:08:27 2009-3-10 11:30 
説明が必要なのは、以上はWebアプリケーションで計画的なタスクを実行するだけの簡単な例であり、複数のタスクに対しては、異なるスレッド内で作業を行う必要があり、計画の配置も簡単であり、実際にはサイトの詰まりが必要であり、マシンの場合。また、ここでは間違った処理などの仕事も行っていませんので、もっと完璧なコードが書けると信じています。
ダウンロードのソースコードをクリックしてください。
資源回収、webにアクセスがない場合、タイマーは回収停止します。End時に自動で訪問してもいいですか?この間この方法をテストしましたが、大丈夫です。

void Application_End(object sender, EventArgs e)
{
///
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)
{
// , 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);
}
}