• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

asp 搞代码 4年前 (2022-01-03) 30次浏览 已收录 0个评论

b/s模式下用程序实现计划任务,一直是个不太好解决和管理的问题,当然可以采用ajax 计时器的方法模拟form端的timer事件。

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

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

代码如下:
///

/// 工作单元接口,定义一个计划任务必须完成的工作
///

public interface IScheduledTask
{
///

/// 任务执行
///

void Execute();
}

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

代码如下:
///

/// 用来执行计划任务的基本对象
///

public class ScheduledTask
{
private static readonly ScheduledTask _ScheduledTask = null;

private Timer UpdateTimer = null;

///

/// 间隔时间,单位为毫秒
///

private int interval = 10 * 1000;
///

/// 间隔时间,单位为毫秒
///

public int Interval
{
get { return this.interval; }
set { this.interval = value; }
}
///

/// 任务是否完成标志
///

private int _IsRunning;

///

/// 静态构造函数,保证实例的唯一性
///

static ScheduledTask()
{
_ScheduledTask = new ScheduledTask();
}
///

/// 任务队列
///

private ArrayList tasks = new ArrayList();
/// 来源[email protected]搞@^&代*@码网

/// 任务队列
///

public ArrayList Tasks { get { return tasks; } }

///

/// 返回任务实例
///

///
public static ScheduledTask Instance()
{
return _ScheduledTask;
}

///

/// 执行任务
///

public void Start()
{
if (UpdateTimer == null)
{
UpdateTimer = new Timer(new TimerCallback(UpdateTimerCallback), null, interval, interval);
}
}

///

/// 任务处理
///

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

///

/// 取消任务
///

public void Stop()
{
if (UpdateTimer != null)
{
UpdateTimer.Dispose();
UpdateTimer = null;
}
}

///

/// 记录日志至文本文件
///

///
///
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();
}
}
}

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

代码如下:
///

/// 计划任务–定时发送邮件
///

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 17)
{
ScheduledTask.CreateLog(“没到发送时间”, true);
return;
}

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

mail发送程序。。。
*/
}

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

代码如下:

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

以上就是asp.net 计划任务管理程序实现,多线程任务加载的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:asp.net 计划任务管理程序实现,多线程任务加载

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址