Как написать планировщик C#

Как написать предупреждение, которое будет работать на 00:00, 00:15, 00:30, и так каждый день?

можете ли вы дать мне пример кода?

спасибо.

6 ответов


вы можете использовать таймер, который работает каждую минуту, которая проверяет текущее время. Чек может выглядеть так:

private void OnTimerTick()
{
    if(DateTime.Now.Minutes%15==0)
    {
        //Do something
    }
}

но если вы ищете программу или службу, которая должна запускаться каждые 15 минут, вы можете просто написать свое приложение и запустить его с помощью запланированной задачи windows.


вы можете написать свою программу для выполнения определенной задачи каждый раз, когда она открывается, затем вы используете запланированные задачи Windows для выполнения вашей программы каждый день в определенное время.

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

Если вы действительно хотите реализовать планирование самостоятельно, есть фреймворки и библиотеки, такие как этот:Quartz.NET


Если вы хотите службу windows, которая выполняет некоторый код с некоторым промежутком времени, вам нужно создать проект службы (см. здесь), и использовать в этой службе класс Timer (см. здесь). Если вы хотите запустить эту задачу при выполнении приложения windows, используйте Windows.Формы.Таймер, как упоминалось ранее.


есть разные таймеры в .NET

  • система.Нарезка резьбы.Таймер
  • система.Окна.Формы.Таймер
  • система.Таймеры.Таймер

в зависимости от того, что вы хотите сделать (и в какой среде, threadsave, bla bla) вы должны выбрать один из них.

некоторые информация


вот базовый планировщик C#:

using System;
using System.Threading;
using System.Windows.Forms;
using System.IO;

public class TimerExample
{
    public static void Main()
    {
        bool jobIsEnabledA = true;
        bool jobIsEnabledB = true;
        bool jobIsEnabledC = true;

        Console.WriteLine("Starting at: {0}", DateTime.Now.ToString("h:mm:ss"));

        try
        {
            using (StreamWriter writer = File.AppendText("C:\scheduler_log.txt"))
            {
                while (true)
                {
                    var currentTime = DateTime.Now.ToString("h:mm");

                    if (currentTime == "3:15" && jobIsEnabledA)
                    {
                        jobIsEnabledA = false;
                        ThreadPool.QueueUserWorkItem((state) => { MessageBox.Show(string.Format("Time to brush your teeth! {0}", currentTime) ); });
                    }

                    if (currentTime == "3:20" && jobIsEnabledB)
                    {
                        jobIsEnabledB = false;
                        ThreadPool.QueueUserWorkItem((state) => { MessageBox.Show(string.Format("Time to brush your teeth! {0}", currentTime)); });
                    }

                    if (currentTime == "3:30" && jobIsEnabledC)
                    {      
                        jobIsEnabledC = false;
                        ThreadPool.QueueUserWorkItem((state) => { MessageBox.Show(string.Format("Time for your favorite show! {0}", currentTime)); });
                    }

                    if (currentTime == "3:31")
                    {      
                        jobIsEnabledA = true;
                        jobIsEnabledB = true;
                        jobIsEnabledC = true;
                    }

                    var logText = string.Format("{0} jobIsEnabledA: {1} jobIsEnabledB: {2} jobIsEnabledC: {3}", DateTime.Now.ToString("h:mm:ss"), jobIsEnabledA, jobIsEnabledB, jobIsEnabledC);
                    writer.WriteLine(logText);

                    Thread.Sleep(1000);
                }
            }
        }
        catch (Exception exception)
        {
            Console.WriteLine(exception);
        }
    }
}

например:

using System.Timers;
    class Program
    {
        static void Main(string[] args)
        {
            Timer timer = new Timer();
            timer.Interval = new TimeSpan(0, 15, 0).TotalMilliseconds;
            timer.AutoReset = true;
            timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
            timer.Enabled = true;
        }

        static void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            throw new NotImplementedException();
        }
    }