2012-03-12 30 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がfalseの場合、私はあることをserviceStartedとserviceLoadを無視するガベージコレクタを伝え、呼び出されますきれいにされた。 loadData()を初めて呼び出してデータを取得し、loadData()が再び呼び出されるまで待機するタイマーの間隔を「生成」します。次に、イベントハンドラを作成し、タイマーを開始します。

writeLog()プロシージャを使用すると、loadData()が呼び出されたときにわかります。それが呼び出されるべき時間(00:00:00時間)を待っている間、loadData()が呼び出されることはありませんが、別の時間まで...私は間隔を計算する方法が完全ではないためかもしれません。

その後、同じ日に1回、次の日に1回呼び出されます。最後に2日後には、loadData()の呼び出しが全くないので、ガーベジコレクターが削除したため、serviceLoader()を再度呼び出すと、loadData()が呼び出されて実際にserviceStartedが呼び出されるきれいにされていると確かにserveLoadもきれいにされている。

あなたは私が間違っていることについて考えていますが、どうすればこの問題を解決できますか? IISを使ってこれを行う方法がないとは思えませんでした。

ありがとうございます。

エルフ

+1

IISでこれを行うための堅牢な方法はありません - アプリケーションプール/プロセスはいくつかの機会にリロードされます。設定オプションがありますが、基本的にIISが必要と判断した場合は、appdomain/processをアンロードしてリロードします。 – Yahia

+0

これは、アプリケーションが使用されている場合でも発生しますか?アプリケーションはほぼ一日中使用され、loadDataは夜間に初期化されるはずです。とにかく、IISはserviceLoadをきれいにしてリロードしますか? – Elder

+0

はい - これはアプリケーションが使用されている場合でも... – Yahia

答えて

2

あなたが書いたコードのエントリポイントがないようです。典型的なaspnetエントリはPage_Loadですが、あなたのpurpouseではApplication_StartGlobal.asaxに使用する必要があります。

とにかくIIS Webアプリケーションはスケジュールされたタスクをホストするためのものではありませんので、代わりにタスクスケジューラまたはWindowsサービスによって呼び出される.exeを開発することをお勧めします。

+0

このテストを行うには、ある時点でserviceLoaderプロシージャが呼び出され、何が起きているのかを知るために待機します。私は.exeを実行する方が良いかもしれないが、私が前に書いたようにIIS内でそれを必要としていることを知っている。 – Elder

0

IISではなくWindowsサービスでこの種のロジックを実装する必要があります。

+0

それで、IISでこれを動作させることは不可能ですか? – Elder

関連する問題