2017-04-16 74 views
0

我做了一个定时器功能,看起来像这样:定时器/触发只能一天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(); 
    } 

我发现我的扳机后,我开始运行应用程序的只有一天,而应用程序正在运行24/7在服务器上,所以它从不关闭。我需要它在一周中的每一天都运行,一些想法在哪里可以做到这一点?

+0

看起来像这样会更好地完成作为一个计划的任务。 –

回答

1

你给你的计时器构造函数的最后一个参数是Timeout.InfiniteTimeSpan - 但是检查documentation参数是:

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

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

如果这是每天它应该是像TimeSpan.FromHours(24.0)。

+0

谢谢你的男人,像魅力:) –

1

您可以使用此下面的代码片段,而不是一个计时器:

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)); 

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