2012-03-12 126 views
1

我需要在我的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来做到这一点。

预先感谢您的阅读时间。

长老

+1

在IIS中没有强大的方法来执行此操作 - 应用程序池/进程会多次重新加载。有配置选项,但基本上如果IIS确定它是必要的,它会卸载你的appdomain /进程并重新加载它! – Yahia 2012-03-12 16:22:29

+0

即使应用程序正在使用,这种情况会发生吗?应用程序将几乎整天都在使用,并且loadData应该在晚上进行初始化。无论如何,IIS会重新加载serviceLoad清理? – Elder 2012-03-19 16:00:16

+0

YES - 即使正在使用应用程序,也会这样... – Yahia 2012-03-19 16:13:59

回答

2

看来您的代码没有切入点。典型的aspnet条目是Page_Load,但在您的purpouse中,您必须在Global.asax中使用Application_Start

无论如何IIS Web应用程序并不打算托管计划的任务,所以我建议开发一个.exe以便由Task Scheduler或Windows服务调用。

+0

过程serviceLoader在某些时候被调用来执行此测试,然后我只是等待知道发生了什么。我知道做一个.exe可能会更好,但是我之前在IIS中需要它。 – Elder 2012-03-19 15:54:52

0

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

+0

那么这是不可能有这在IIS中工作? – Elder 2012-03-19 16:00:49