首页 > Asp.net设计一个定时任务系统的问题

Asp.net设计一个定时任务系统的问题

定时任务系统,其实就是一个定时执行指定任务的一个系统。类似定时发微博、定时执行采集任务。我现在正在设计一个系统,遇到一些问题,想向大家请教。看一下大家有没有更好的方法来对这个系统进行架构或编写。

我的系统是使用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 在空闲时会销毁静态类,我想这里是因为IIS在空闲时会回收application pool的关系。
所以解决方案有几个:
第一种是用windows service而不是用asp.net,具体技术可以参考Quartz.Net这个开源的工具,它利用Cron Trigger的方式设定执行任务的频率,而且可以在一个windows 服务中执行多个任务,每个可以设定不同的频率。
第二种方案是做Console application,然后部署在Windows 的 Task Scheduler下。
第三种方案是做成Web API的形式,用Console Application定时启动并访问执行任务的API


asp.net => db => windows服务

【热门文章】
【热门文章】