Планирование службы Windows для ежедневного ежедневного запуска в 6:00

Я создал службу Windows, и я хочу, чтобы служба планировала выполнять ежедневно в 6:00 утра. Ниже приведен код, который я написал: -

public Service1()
{
    InitializeComponent();
}

protected override void OnStart(string[] args)
{
    try
    {
        ExtractDataFromSharePoint();
    }
    catch (Exception ex)
    {
        //Displays and Logs Message
        _loggerDetails.LogMessage = ex.ToString();
        _writeLog.LogDetails(_loggerDetails.LogLevel_Error, _loggerDetails.LogMessage);
    }
}

В приведенном выше коде вы можете видеть, что в OnStart Способе обслуживания я вызываю функцию ExtractDataFromSharePoint(). Как я планирую это запустить ежедневно утром в 6:00 утра.

Ответ 1

Здесь у вас есть 2 способа выполнить ваше приложение для ежедневного запуска в 6 часов.

1) Создайте консольное приложение и через планировщик окон выполните 6 часов.

2) Создайте таймер (System.Timers.Timer) в своей службе Windows, которая выполняется в каждый определенный интервал и в вашей функции, вы должны проверить, будет ли системное время = 6 AM, а затем выполнить ваш код

ServiceTimer = new System.Timers.Timer();
ServiceTimer.Enabled = true;
ServiceTimer.Interval = 60000 * Interval;
ServiceTimer.Elapsed += new System.Timers.ElapsedEventHandler(your function);

Примечание. В вашей функции вы должны написать код для выполнения своего метода в течение 6 часов утра не каждый раз

Ответ 2

Для этого вам не нужна услуга. Просто создайте обычное консольное приложение, а затем используйте планировщик Windows для запуска вашей программы в 6 утра. Услуга - это когда вам нужно, чтобы ваша программа выполнялась все время.

Ответ 3

Вот код, который будет работать внутри службы каждый день в 6 утра.

включают:

using System.Threading;

также убедитесь, что вы объявили свой таймер в классе:

private System.Threading.Timer _timer = null;

Функция StartTimer, представленная ниже, принимает время запуска и интервал, и в настоящее время настроена на запуск в 6:00 и запуск каждые 24 часа. Вы можете легко изменить его, чтобы начать в другое время и интервал, если это необходимо.

 protected override void OnStart(string[] args)
    {
        // Pass in the time you want to start and the interval
        StartTimer(new TimeSpan(6, 0, 0), new TimeSpan(24, 0, 0));

    }
    protected void StartTimer(TimeSpan scheduledRunTime, TimeSpan timeBetweenEachRun) {
        // Initialize timer
        double current = DateTime.Now.TimeOfDay.TotalMilliseconds;
        double scheduledTime = scheduledRunTime.TotalMilliseconds;
        double intervalPeriod = timeBetweenEachRun.TotalMilliseconds;
        // calculates the first execution of the method, either its today at the scheduled time or tomorrow (if scheduled time has already occurred today)
        double firstExecution = current > scheduledTime ? intervalPeriod - (current - scheduledTime) : scheduledTime - current;

        // create callback - this is the method that is called on every interval
        TimerCallback callback = new TimerCallback(RunXMLService);

        // create timer
        _timer = new Timer(callback, null, Convert.ToInt32(firstExecution), Convert.ToInt32(intervalPeriod));

    }
    public void RunXMLService(object state) {
        // Code that runs every interval period
    }

Ответ 4

Спасибо @Rachit за ваш ответ, и теперь я могу выполнить мои требования.

static  System.Timers.Timer _timer;
static string _ScheduledRunningTime ="6:00 AM";
public Service1()
{
    InitializeComponent();
}

protected override void OnStart(string[] args)
{
    try
    {
        _timer = new System.Timers.Timer();
        _timer.Interval = TimeSpan.FromMinutes(1).TotalMilliseconds;//Every one minute
        _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
        _timer.Start();
    }
    catch (Exception ex)
    {
        //Displays and Logs Message
        _loggerDetails.LogMessage = ex.ToString();
        _writeLog.LogDetails(_loggerDetails.LogLevel_Error, _loggerDetails.LogMessage);
     }
 }

static void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    //Displays and Logs Message
    _loggerDetails.LogMessage = "timer_Elapsed method at :"+DateTime.Now ;
    _writeLog.LogDetails(_loggerDetails.LogLevel_Info, _loggerDetails.LogMessage);

    string _CurrentTime=String.Format("{0:t}", DateTime.Now);
    if (_CurrentTime == _ScheduledRunningTime)
    {
        ExtractDataFromSharePoint();
    }
}

Ответ 5

Если служба действительно нужна, посмотрите на Quartz.NET, чтобы выполнить планирование для вас

http://www.quartz-scheduler.net/

Ответ 6

Вот код, который делает вызов БД и устанавливает время планировщика на основе результатов:

Кроме того, вы можете позвонить на несколько вызовов API, которые сами отправляют обычные SMS/электронные письма.

public void ScheduleService()
    {
        try
        {
            dsData = new DataSet();
            _timeSchedular = new Timer(new TimerCallback(SchedularCallBack));
            dsData = objDataManipulation.GetInitialSMSConfig();
            if (dsData.Tables[0].Rows.Count > 0)
            {                    
                DateTime scheduledTime = DateTime.MinValue;
                scheduledTime = DateTime.Parse(dsData.Tables[0].Rows[0]["AUTOSMSTIME"].ToString());
                if (string.Format("{0:dd/MM/YYYY HH:mm}", DateTime.Now) == string.Format("{0:dd/MM/YYYY HH:mm}", scheduledTime))
                {
                    objDataManipulation.WriteToFile("Service Schedule Time Detected");
                    for (int iRow = 0; iRow < dsData.Tables[0].Rows.Count; iRow++)
                    {
                            if (dsData.Tables.Count > 1)
                            {
                                if (dsData.Tables[1].Rows.Count > 0)
                                {
                                    sendData(dsData);
                                }
                            }
                            else
                            {
                                objDataManipulation.WriteToFile("No SMS Content Data !");
                            }                        }
                }
                if (DateTime.Now > scheduledTime)
                {
                    scheduledTime = scheduledTime.AddDays(1);
                }                   
                TimeSpan timeSpan = scheduledTime.Subtract(DateTime.Now);
                string schedule = string.Format("{0} day(s) {1} hour(s) {2} minute(s) {3} seconds(s)", timeSpan.Days, timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds);

                objDataManipulation.WriteToFile("TexRetail Service scheduled to run after: " + schedule + " {0}");
                int dueTime = Convert.ToInt32(timeSpan.TotalMilliseconds);
                //Change the Timer Due Time.
                _timeSchedular.Change(dueTime, Timeout.Infinite);                    
            }
        }
        catch (Exception ex)
        {                              
            objDataManipulation.WriteToFile("Service Error {0}" + ex.Message + ex.StackTrace + ex.Source);
            using (System.ServiceProcess.ServiceController serviceController = new System.ServiceProcess.ServiceController(ServiceName))
            {
                serviceController.Stop();
            }
        }
    }