任务计划程序IIS端与C#
我需要在我的web应用程序中运行任务。我一直在阅读,大部分答案都是在Windows中使用任务调度程序,但我需要的是将其放在Web应用程序本身中。任务计划程序IIS端与C#
我终于得到的东西,几乎工程,但我仍然有一些麻烦:
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();
}
}
}
的ServiceLoader()将被调用,如果serviceStarted是假的,那么我告诉垃圾收集器忽略serviceStarted和serviceLoad是清洗。 第一次调用loadData()以获取数据并“生成”定时器等待的时间间隔,直到再次调用loadData()。然后我创建事件处理程序并启动计时器。
使用writeLog()过程我知道何时loadData()被调用。等待它应该被调用的时间(00:00:00小时),没有调用loadData(),但直到不同的时间......这可能是因为我计算间隔的方式并不完全正确。
然后它被再次调用当天和第二天。最后在第二天之后,根本没有调用loadData(),所以我想这是因为垃圾收集器删除它,再次调用serviceLoader(),同时调用loadData()告诉我,实际上serviceStarted已经已经清理过,并且确实已经加载了。
你对我做错了什么有什么想法,我怎么能得到这个工作?我无法相信有没有办法使用IIS来做到这一点。
预先感谢您的阅读时间。
长老
看来您的代码没有切入点。典型的aspnet条目是Page_Load
,但在您的purpouse中,您必须在Global.asax
中使用Application_Start
。
无论如何IIS Web应用程序并不打算托管计划的任务,所以我建议开发一个.exe以便由Task Scheduler或Windows服务调用。
过程serviceLoader在某些时候被调用来执行此测试,然后我只是等待知道发生了什么。我知道做一个.exe可能会更好,但是我之前在IIS中需要它。 – Elder 2012-03-19 15:54:52
在IIS中没有强大的方法来执行此操作 - 应用程序池/进程会多次重新加载。有配置选项,但基本上如果IIS确定它是必要的,它会卸载你的appdomain /进程并重新加载它! – Yahia 2012-03-12 16:22:29
即使应用程序正在使用,这种情况会发生吗?应用程序将几乎整天都在使用,并且loadData应该在晚上进行初始化。无论如何,IIS会重新加载serviceLoad清理? – Elder 2012-03-19 16:00:16
YES - 即使正在使用应用程序,也会这样... – Yahia 2012-03-19 16:13:59