asp.net 计划任务管理程序实现,多线程任务加载

asp.net下实现可以将计划任务的方法放在global里,使用一个统一的任务管理类来管理各种任务的执行,做到并行不悖!
下面是我写的一个方法,希望起个抛砖引玉的作用!大家一起学习下:

第一步定义一个接口,用来规范任务必须要实现的动作,该接口只有一个方法(简单起见):

代码如下:

/// <summary>
/// 工作单元接口,定义一个计划任务必须完成的工作
/// </summary>
public interface IScheduledTask
{
/// <summary>
/// 任务执行
/// </summary>
void Execute();
}

第二步,定义一个类,用来管理计划任务的执行和关闭:

代码如下:

/// <summary>
/// 用来执行计划任务的基本对象
/// </summary>
public class ScheduledTask
{
private static readonly ScheduledTask _ScheduledTask = null;

private Timer UpdateTimer = null;

/// <summary>
/// 间隔时间,单位为毫秒
/// </summary>
private int interval = 10 * 1000;
/// <summary>
/// 间隔时间,单位为毫秒
/// </summary>
public int Interval
{
get { return this.interval; }
set { this.interval = value; }
}
/// <summary>
/// 任务是否完成标志
/// </summary>
private int _IsRunning;

/// <summary>
/// 静态构造函数,保证实例的唯一性
/// </summary>
static ScheduledTask()
{
_ScheduledTask = new ScheduledTask();
}
/// <summary>
/// 任务队列
/// </summary>
private ArrayList tasks = new ArrayList();
/// <summary>
/// 任务队列
/// </summary>
public ArrayList Tasks { get { return tasks; } }

/// <summary>
/// 返回任务实例
/// </summary>
/// <returns></returns>
public static ScheduledTask Instance()
{
return _ScheduledTask;
}

/// <summary>
/// 执行任务
/// </summary>
public void Start()
{
if (UpdateTimer == null)
{
UpdateTimer = new Timer(new TimerCallback(UpdateTimerCallback), null, interval, interval);
}
}

/// <summary>
/// 任务处理
/// </summary>
/// <param name="sender"></param>
private void UpdateTimerCallback(object sender)
{
if (Interlocked.Exchange(ref _IsRunning, 1) == 0)
{
try
{
//执行多个任务
foreach (IScheduledTask task in Tasks)
{
ThreadStart myThreadDelegate = new ThreadStart(task.Execute);
Thread myThread = new Thread(myThreadDelegate);
myThread.Start();
}
}
catch (Exception ex)
{
//错误处理
CreateLog(ex.Message, true);
}
finally
{
Interlocked.Exchange(ref _IsRunning, 0);
}
}
}

/// <summary>
/// 取消任务
/// </summary>
public void Stop()
{
if (UpdateTimer != null)
{
UpdateTimer.Dispose();
UpdateTimer = null;
}
}

/// <summary>
/// 记录日志至文本文件
/// </summary>
/// <param name="message"></param>
/// <param name="iserror"></param>
public static void CreateLog(string message, bool iserror)
{
DateTime dt = DateTime.Now;
int y = dt.Year;//当前的年份
int m = dt.Month;//当前的月份

string root = HttpRuntime.AppDomainAppPath;

root += "ScheduledTaskLogs";

if (!File.Exists(root)) Directory.CreateDirectory(root);

string dir_y = root + "\\" + y.ToString();
string dir_m = dir_y + "\\" + m.ToString();
string err = iserror ? "_taskerror" : "_task";
string dirOk = dir_m + "\\" + dt.Year + dt.Month + dt.Day + err + ".txt";

//以当前年份为名创建新目录
if (!File.Exists(dir_y)) Directory.CreateDirectory(dir_y);

//以当前月份为名创建新目录
if (!File.Exists(dir_m)) Directory.CreateDirectory(dir_m);

string err1 = iserror ? "错误" : "";

if (File.Exists(dirOk))
{
StreamWriter sr = new StreamWriter(dirOk, true, Encoding.Default);
lock (sr)
{
sr.WriteLine();
sr.WriteLine("--------------计划任务" + err1 + "日志-----------------------------------------------------------------------");
sr.WriteLine(err1 + "时间: " + DateTime.Now.ToString());
sr.WriteLine("详细内容: " + message);
sr.WriteLine("--------------------------------------------------------------------------------------------");
}
sr.Close();
sr.Dispose();
}
else
{
StreamWriter sr = new StreamWriter(dirOk, false, Encoding.Default);
lock (sr)
{
sr.WriteLine();
sr.WriteLine("--------------计划任务" + err1 + "日志-----------------------------------------------------------------------");
sr.WriteLine(err1 + "时间: " + DateTime.Now.ToString());
sr.WriteLine("详细内容: " + message);
sr.WriteLine("--------------------------------------------------------------------------------------------");
}
sr.Close();
sr.Dispose();
}
}
}

第三步,定义要做的动作处理类,继承第一步定义的接口,下面的例子是一个定时邮件发送程序,在规定的时间段执行邮件发送:


代码如下:

/// <summary>
/// 计划任务--定时发送邮件
/// </summary>
public class Task_MailSend : IScheduledTask
{
public void Execute()
{
string nw = DateTime.Now.ToString("HH");

int hh = 0;
if (!Int32.TryParse(nw, out hh)) { return; }

//每天11-13点发送邮件
if (hh < 10 || hh > 17)
{
ScheduledTask.CreateLog("没到发送时间", true);
return;
}

DataTable dt = GetOrderedUser();
int num = dt.Rows.Count;
if (num == 0)
{
ScheduledTask.CreateLog("目前没有用户订阅", true);
return;
}
/*

mail发送程序。。。
*/
}

好了,执行上面三步后,剩下的工作就交给global来做了!

代码如下:

<script runat="server"><!--

void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
//WildRen.Common是我这里的命名空间
WildRen.Common.ScheduledTask.Instance().Interval = 12 * 60 * 60000;//设置计划任务执行时间间隔
WildRen.Common.ScheduledTask.Instance().Tasks.Add(new Task_MailSend());//向计划任务管理程序添加要执行的动作
WildRen.Common.ScheduledTask.Instance().Start();//启动任务
}

void Application_End(object sender, EventArgs e)
{
// 在应用程序关闭时运行的代码
WildRen.Common.ScheduledTask.Instance().Stop();

}

// --></script>

如果使用ajax连接此管理类模拟客户端timer事件经行处理也是可以的!当然方法不是唯一的,此程序可能存在一些不足之处,欢迎大家指正!

(0)

相关推荐

  • 使用.Net实现多线程经验总结

    1.简述 一般一个程序一个进程,代码是存在进程中的,进程本身不执行代码, 执行代码的是线程. 一般一个进程里就一个线程.(一个商店就一个老板娘.) 进程就是在内存中开辟了一个空间.代码,图片..等就存在这个空间里.代码线程去执行. 默认只有一个线程. 复制代码 代码如下: systerm.threading //线程操作的类在这个命名空间下. 2.前台线程与后台线程. 开启一个线程,就是创建一个线程对象即可. 线程默认情况下都是前台线程. 要把所有的前台线程执行完后,程序才会退出. 进程里默认的

  • ASP.NET:一段比较经典的多线程学习代码

    一段比较经典的多线程学习代码. 1.用到了多线程的同步问题. 2.用到了多线程的顺序问题. 如果有兴趣的请仔细阅读下面的代码.注意其中代码段的顺序,思考一下,这些代码的顺序能否互相调换,为什么?这应该对学习很有帮助的.为了演示,让所有的线程都Sleep了一段时间. using System.Net;using System;using System.IO;using System.Text;using System.Threading;using System.Diagnostics; name

  • .Net多线程编程(误用点分析)

    1 共享变量问题 错误写法: 所有的任务可能会共享同一个变量,所以输出结果可能会一样. public static void Error() { for(int i=0;i<10;i++) { Task.Run(() => { Console.WriteLine("{0}", i); }); } } 正确写法: 将变量i赋给局部变量temp,使得每一个任务使用不同的i值. public static void Right() { for (int i = 0; i <

  • .NET Framework中定时器timer的单线程与多线程使用讲解

    如果你需要使用规律的时间间隔重复执行一些方法,最简单的方式是使用定时器(timer).与下边的例子相比,定时器可以便捷.高效地使用内存和资源: new Thread (delegate() { while (enabled) { DoSomeAction(); Thread.Sleep (TimeSpan.FromHours (24)); } }).Start(); 这不仅仅会永久占用一个线程,而且如果没有额外的代码,DoSomeAction每天都会发生在更晚的时间.定时器解决了这些问题. .N

  • c#.net多线程编程教学——线程同步

    随着对多线程学习的深入,你可能觉得需要了解一些有关线程共享资源的问题. .NET framework提供了很多的类和数据类型来控制对共享资源的访问. 考虑一种我们经常遇到的情况:有一些全局变量和共享的类变量,我们需要从不同的线程来更新它们,可以通过使用System.Threading.Interlocked类完成这样的任务,它提供了原子的,非模块化的整数更新操作. 还有你可以使用System.Threading.Monitor类锁定对象的方法的一段代码,使其暂时不能被别的线程访问. System

  • C#(asp.net)多线程用法示例(可用于同时处理多个任务)

    本文实例讲述了C#(asp.net)多线程用法.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Threading; using System.Web.UI.WebControls; public partial class muti_thread : System.Web.

  • .NET Windows 多线程thread编程

    进程:工厂搬砖头,10个工人搬完1000个砖头 线程:每个工人,搬完100个砖头,就是一个任务 采用线程,异步搬: 手工去搬,10个工人同时搬,效率高,异步执行,如果不采用线程,等第一个人搬完后第二个人才搬,那就慢了 什么时候不能用线程: 如果要用小车来搬,只有一个小车,那么,在这样的情况下,就不应该用线程,因为只有一个小车,各个线程都在争夺和等待这个小车,所以不能用线程.如果这个时候还要用线程,则导致资源浪费, 因为每个线程都有自己的资源,如包工头(CPU)同一时间要管理这10个工人,而只有一

  • .net面向对象之多线程(Multithreading)及 多线程高级应用

    在.net面向对象程序设计阶段在线程资源共享中的线程安全和线程冲突的解决方案:多线程同步,使用线程锁和线程通知实现线程同步,具体内容介绍如下: 1. ThreadStatic特性 特性:[ThreadStatic] 功能:指定静态字段在不同线程中拥有不同的值 在此之前,我们先看一个多线程的示例: 我们定义一个静态字段: static int num = 0;  然后创建两个线程进行分别累加: new Thread(() => { for (int i = 0; i < 1000000; i++

  • 一些.NET对多线程异常处理技巧分享

    多线程环境 在我们的产品 SE 中,出现多线程的地方主要有两大类,一类是通过 ThreadPool 或 new Thread 主动发起多线程,另一类是 Socket 通讯回调. 多线程异常捕获 对于一般的异常处理来说,我们只要简单的将可能出错的语句包含在 try/catch 语句中即可.我也曾经简单的将该方法运用于多线程的异常捕获,结果并非如此,代码如下: 复制代码 代码如下: public static void Main() {     try     {         new Threa

  • Cocos2d-x 3.0多线程异步加载资源实例

    Cocos2d-x从2.x版本到上周刚刚才发布的Cocos2d-x 3.0 Final版,其引擎驱动核心依旧是一个单线程的"死循环",一旦某一帧遇到了"大活儿",比如Size很大的纹理资源加载或网络IO或大量计算,画面将 不可避免出现卡顿以及响应迟缓的现象.从古老的Win32 GUI编程那时起,Guru们就告诉我们:别阻塞主线程(UI线程),让Worker线程去做那些"大活儿"吧. 手机游戏,即便是休闲类的小游戏,往往也涉及大量纹理资源.音视频资

  • ASP.NET Core中修改配置文件后自动加载新配置的方法详解

    前言 在 ASP.NET Core 默认的应用程序模板中, 配置文件的处理如下面的代码所示: config.AddJsonFile( path: "appsettings.json", optional: true, reloadOnChange: true ); config.AddJsonFile( path: $"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: t

  • asp.net 计划任务管理程序实现,多线程任务加载

    asp.net下实现可以将计划任务的方法放在global里,使用一个统一的任务管理类来管理各种任务的执行,做到并行不悖! 下面是我写的一个方法,希望起个抛砖引玉的作用!大家一起学习下: 第一步定义一个接口,用来规范任务必须要实现的动作,该接口只有一个方法(简单起见): 复制代码 代码如下: /// <summary> /// 工作单元接口,定义一个计划任务必须完成的工作 /// </summary> public interface IScheduledTask { /// <

  • asp.net Application_AcquireRequestState事件,导致Ajax客户端不能加载

    开发环境IIS7下一切正常,但是部署到IIS6服务器以后, 每次刷新页面总出现Ajax客户端不能加载的问题. 复制代码 代码如下: protected void Application_AcquireRequestState(object sender, EventArgs e) { string oldToken = Session["token"].ToString(); } MSDN上说: Application_AcquireRequestState, 当ASP.NET获取当前

  • ASP.NET MVC使用jQuery的Load方法加载静态页面及注意事项

    使用使用jQuery的Load方法可以加载静态页面,本篇就在ASP.NET MVC下实现. Model先行: public class Article { public int Id { get; set; } public string Url { get; set; } } 在HomeController中的Index方法,向视图传递一个Article强类型. public class HomeController : Controller { public ActionResult Ind

  • ASP下通过Adodb.Stream实现多线程下载大文件

    有个朋友 做 某种小众音乐交换站的(他们那个行业的昵图网),需要用到付费下载.尝试过 防盗链,不太理想,最终使用了 Adodb.Stream 读取,直接输出. 解决了 盗版的问题,但是新的问题又来了.Adodb.Stream 这种方式 电脑还好说,大部分电脑浏览器都支持.移动端 很多 浏览器为了 加速读取,会多线程下载导致 文件无法正常读取. 抓包,发现增加了 HTTP头 HTTP_RANGE.隐约记得 之前读过 王大(王洪影)的 <深入解析 ASP核心技术>当中提到ASP多线程下载的问题,回

  • asp.net动态加载用户控件,关于后台添加、修改的思考

    看下下面这个典型的后台(比较粗糙):说实在,我很厌倦全部用.aspx文件去做,比如"友情连接"这个模块,就有"添加友情连接""修改友情连接""友情连接列表",简单的话,可以把"添加""修改"合成一个文件.每次都去建立一个.aspx文件.我现在的想法是用"用户控件+配置文件"去实现,虽然文件数目可能不会少很多.但在编程到一定地步,我想大家会有跟我一样的想法. 首先需要涉

  • asp.net通过动态加载不同CSS实现多界面

    方法一: 复制代码 代码如下: <%@page language="C#"%> <%@import namespace="System.Data"%> <script language="c#" runat="server"> public void page_load(Object obj,EventArgs e) {   //创建服务器端控件.   //指定的标记"LINK&q

  • asp.net+jquery滚动滚动条加载数据的下拉控件

    这样的需求貌似自己感觉不是很合理,因为数据多了如此下拉无论从人还是机器操作都比较痛苦. 没办法由于需求下来了,只能按需求操作.网上找了很多相关控件都感觉有点庞大,占资源比较多.没办法自己花半天时间弄出个半成品自定义控件,拿出来分享下,如有高手看了请多指点. 需求:AJAX滚动滚动条加载数据的下拉列表 控件名称:Webcombo 所用技术:ASP.NET(C#),jQuery,ASP.NET一般处理文件(.ashx) 下拉列表具体实现:用DIV模拟下拉列表,input和图片模拟下拉框.最终结果如下

  • Asp.net利用JQuery弹出层加载数据代码

    首先我们新建一个网站,在网站里面新增一般处理程序,命名为ReadData.ashx.然后在里面输入如下代码: 复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.Data.SqlClient; //引入命名空间 using System.Data; namespace 加载层 {

随机推荐