2012-03-12 119 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