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を使ってこれを行う方法がないとは思えませんでした。
ありがとうございます。
エルフ
IISでこれを行うための堅牢な方法はありません - アプリケーションプール/プロセスはいくつかの機会にリロードされます。設定オプションがありますが、基本的にIISが必要と判断した場合は、appdomain/processをアンロードしてリロードします。 – Yahia
これは、アプリケーションが使用されている場合でも発生しますか?アプリケーションはほぼ一日中使用され、loadDataは夜間に初期化されるはずです。とにかく、IISはserviceLoadをきれいにしてリロードしますか? – Elder
はい - これはアプリケーションが使用されている場合でも... – Yahia