Планировщик заданий на стороне IIS с C # - PullRequest
1 голос
/ 12 марта 2012

Мне нужно, чтобы задачи выполнялись в моем веб-приложении.Я читал, и большинство ответов - использовать планировщик задач в Windows, но мне нужно иметь его в самом веб-приложении.

Я наконец-то получил что-то, что почти работает, но у меня все еще есть некоторыепроблемы:

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 (), но до другого времени ... это может быть потому, что способ вычисления интервала не совсем корректен.

Затем он снова вызывается в тот же день и один раз на следующий день.Наконец, после второго дня вообще нет вызова для loadData (), поэтому я полагаю, что это потому, что сборщик мусора удалил его, снова вызывая serviceLoader (), и одновременно вызывается loadData (), сообщая мне, что в действительности serviceStarted имеетбыл очищен и, конечно, serveLoad также был очищен.

У вас есть представление о том, что я делаю неправильно, и как я могу заставить это работать?Я не мог поверить, что это невозможно сделать с помощью IIS.

Заранее благодарю за то, что уделили мне время на чтение.

Старейшина

Ответы [ 2 ]

2 голосов
/ 12 марта 2012

Кажется, нет точки входа для кода, который вы написали. Типичная запись в aspnet - Page_Load, но в вашей сумме вы должны использовать Application_Start в Global.asax.

В любом случае веб-приложения IIS не предназначены для размещения запланированных задач, поэтому я предлагаю разработать .exe, который будет вызываться планировщиком задач или службой Windows.

0 голосов
/ 12 марта 2012

Вы должны реализовать такую ​​логику в службе Windows, а не в IIS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...