Timer/trigger 仅适用一天 C#

Timer/trigger works only for one day C#

我制作了一个定时器函数,如下所示:

 public Pocetna_forma()
    {
        InitializeComponent();
        Timer_reset(new TimeSpan(11, 37, 00));
    }

 private void Timer_reset(TimeSpan alertTime)
    {
        DateTime current = DateTime.Now;
        TimeSpan timeToGo = alertTime - current.TimeOfDay;
        if (timeToGo < TimeSpan.Zero)
        {
            return;//time already passed
        }
        this.reset = new System.Threading.Timer(x =>
        {
            this.Trigger_brisanje();
        }, null, timeToGo, Timeout.InfiniteTimeSpan);
    }

 private void Trigger_brisanje()
    {
        NpgsqlConnection conn = new NpgsqlConnection(Connectionstring);
        conn.Open();

        NpgsqlCommand upis_odlaska = new NpgsqlCommand("begin;update zaposlenici set polje_stanje=1,vrijeme3=null,vrijeme2=null;commit;", conn);
        upis_odlaska.ExecuteReader();

        conn.Close();
    }

我注意到我的触发器 运行 在我启动该应用程序后仅一天,并且该应用程序在服务器上 运行ning 24/7,因此它永远不会关闭。我一周中的每一天都需要它 运行,一些想法,这样做有什么好处?

您为 Timer 构造函数提供的最后一个参数是 Timeout.InfiniteTimeSpan - 但是检查 documentation 参数是:

public Timer(
  TimerCallback callback,
  object state,
  TimeSpan dueTime,
  TimeSpan period
) 

即最后一个参数应该是重复周期。 因为您提供了无限期,计时器将永远不会再次触发。

如果这是每天,它应该类似于 TimeSpan.FromHours(24.0).

您可以使用以下代码片段代替计时器:

 public static async Task FireTrigger(int hours, int minutes, int seconds)
    {
        do
        {
            if (DateTime.Now.Hour == hours && DateTime.Now.Minute == minutes && DateTime.Now.Second == seconds)
            {
                // Call trigger!

            }
            await Task.Delay(990);
        }
        while (true);
    } 

你可以这样称呼它:

 Task.Run(async () => await FireTrigger(hours, minutes, seconds)); 

这是一个异步任务。它不会阻止您的其他代码,它每秒只运行 1 次,但它每次都会运行。