带有C#的任务计划程序IIS端

本文关键字:程序 IIS 计划 任务 带有 | 更新日期: 2023-09-27 18:27:35

我需要在web应用程序中运行任务。我一直在阅读,大多数答案都是在Windows中使用任务调度程序,但我需要的是在web应用程序本身中使用它。

我终于得到了一些几乎有效的东西,但我仍然有一些麻烦:

using System;
using System.Timers;
using System.IO;
namespace ServiceIIS
{
    public static class Servicios
    {
        public static bool serviceStarted = false;
        static Timer serviceLoad = new Timer();
        public static void serviceLoader()
        {
            if (!serviceStarted)
            {
                GC.KeepAlive(serviceStarted);
                GC.KeepAlive(serviceLoad);
                serviceStarted = true;
                double Intervalo = loadData();
                serviceLoad.Interval = Intervalo;
                serviceLoad.Elapsed += new ElapsedEventHandler(serviceLoad_Elapsed);
                serviceLoad.Enabled = true;
            }
        }
        static void serviceLoad_Elapsed(object sender, ElapsedEventArgs e)
        {
            serviceLoad.Stop();
            double Intervalo = loadData();
            serviceLoad.Interval = Intervalo;
            serviceLoad.Start();
        }
        static double loadData()
        {
            string dailyLoadTime = "00:00:00";
            string log = "";
            /*
                loadData Code
                log = resultMessage;
            */
            using (StreamWriter w = File.AppendText("c:''log.txt"))
                {
                    writeLog(log, w);
                    w.Close();
                }
            return (Convert.ToDateTime(DateTime.Today.ToString("yyyy-MM-ddT") + dailyLoadTime).AddDays(1) - DateTime.Now).TotalMilliseconds;
        }
        public static void writeLog(string resultMessage, TextWriter w)
        {
            w.Write("'r'nLog : ");
            w.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(),
                DateTime.Now.ToLongDateString());
            w.WriteLine("  :");
            w.WriteLine("  :{0}", resultMessage);
            w.WriteLine("-------------------------------");
            w.Flush();
        }
    }
}

如果serviceStarted为false,将调用serviceLoader(),然后我告诉垃圾收集器忽略serviceStarted和要清理的serviceLoad。第一次调用loadData()以获取数据,并"生成"计时器等待的时间间隔,直到再次调用loadData()。然后我创建事件处理程序并启动计时器。

使用writeLog()过程,我知道何时调用loadData()。等待应该调用它的时间(00:00:00小时),没有对loadData()的调用,但直到其他时间。。。这可能是因为我计算区间的方式并不完全正确。

然后在同一天再次调用,第二天调用一次。最后,在第二天之后,根本没有对loadData()的调用,所以我想这是因为垃圾收集器删除了它,再次调用serviceLoader(),同时调用loadData(。

你知道我做错了什么吗?我该怎么做?我简直不敢相信使用IIS没有办法做到这一点。

提前感谢您花时间阅读本文。

老年

带有C#的任务计划程序IIS端

您编写的代码似乎没有入口点。典型的aspnet条目是Page_Load,但在您的用途中,必须在Global.asax中使用Application_Start

无论如何,IIS web应用程序不打算承载计划任务,所以我建议开发一个.exe,由任务调度程序或Windows服务调用。

您应该在Windows服务而不是IIS中实现这种逻辑。