定时任务系统,其实就是一个定时执行指定任务的一个系统。类似定时发微博、定时执行采集任务。我现在正在设计一个系统,遇到一些问题,想向大家请教。看一下大家有没有更好的方法来对这个系统进行架构或编写。
我的系统是使用C#+Asp.net设计。
第一步,我要先设计一个静态类,负责进行计时、一个Mission的抽象类,所有任务进行的父类,方便统一接口。
public static List<mission> Missions = new List<mission>();//负责储存已经在队列中的所有任务。
以下是mission类
public abstract class mission
{
public string MissionName = "无标题任务";
public string Note = "无备注";
public DateTime actiontime;
public bool Isrun = false;
public bool Isrunning = false;
public bool IsErr = false;
public bool IsComplete = false;
public bool Exiting = false;
/// <summary>
/// 自身线程
/// </summary>
public System.Threading.Thread thread;
/// <summary>
/// 任务执行
/// </summary>
public virtual void Run()
{
this.Isrunning = true;
}
public void ThreadStart()
{
thread = new System.Threading.Thread(new ThreadStart(Run));
thread.Start();
}
public void Dispose()
{
Isrunning = false;
Isrun = true;
IsComplete = true;
thread.Abort();
}
public void Log(string msg)
{
//任务日志写入
}
}
以下是负责1秒钟检查一次是否需要执行任务的守护线程
public static void StartDaemons()
{
if (Tdaemons == null)
{
Tdaemons = new Thread(new ThreadStart(daemons));
Tdaemons.Start();
}
else {
Tdaemons.Abort();
}
}
public static void daemons()
{
while (true)
{
Missions.Where(o => o.IsComplete == true).ToList().ForEach(p =>
{
p.Dispose();
Missions.Remove(p);
});
var run = Missions.Where(o => o.Isrun == false && o.actiontime <= DateTime.Now);
foreach (var item in run)
{
item.Isrun = true;
item.ThreadStart();
}
Thread.Sleep(1000);
}
}
通过Global.asax,每次启动程序时开启一个线程进行检测。
protected void Application_Start(object sender, EventArgs e)
{
WorkConsole.Mission.MThread.StartDaemons();
}
问题现在出现了,Asp.net会自动在空闲时或内存不足时销毁静态类。如果保证Asp.net的线程稳定?
我有一个方法是通过编写一个本地程序,每隔半小时访问一次网站,确保线程不会被系统销毁。
任务系统在执行新任务的时候都会启动一个新的线程,这个线程也不稳定,容易导致自动退出,导致任务执行失败。
如果在Asp.net是否能设计定时稳定任务程序?
如果不行,如何更好地通过Asp.net和winform进行交互把在网页设定的任务托付给winfrom去执行?通过SQL的共享还有其他方法?能直接在Asp.net把一个实例化的类传送到Winform吗?
asp.net => db => windows服务