定时器/触发器仅工作一天C#
我制作了一个计时器函数,如下所示:定时器/触发器仅工作一天C#,c#,timer,triggers,method-chaining,C#,Timer,Triggers,Method Chaining,我制作了一个计时器函数,如下所示: public Pocetna_forma() { InitializeComponent(); Timer_reset(new TimeSpan(11, 37, 00)); } private void Timer_reset(TimeSpan alertTime) { DateTime current = DateTime.Now; TimeSpan timeToG
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();
}
public Pocetna_forma()
{
初始化组件();
定时器_重置(新的时间跨度(11,37,00));
}
专用无效计时器\u重置(TimeSpan alertTime)
{
DateTime current=DateTime.Now;
TimeSpan timeToGo=alertTime-current.TimeOfDay;
if(timeToGo
{
这个。触发器_brisanje();
},null,timeToGo,Timeout.InfiniteTimeSpan);
}
私有无效触发器_brisanje()
{
NpgsqlConnection conn=新的NpgsqlConnection(Connectionstring);
conn.Open();
NpgsqlCommand upis_odlaska=新的NpgsqlCommand(“开始;更新zaposlenici set polje_stanje=1,vrijeme3=null,vrijeme2=null;提交;”,conn);
upis_odlaska.ExecuteReader();
康涅狄格州关闭();
}
我注意到我的触发器只在启动应用程序后一天运行,并且该应用程序在服务器上全天候运行,因此它永远不会关闭。我需要它在一周中的每一天运行,一些想法是这样做的关键是什么?您为计时器构造函数提供的最后一个参数是Timeout.InfiniteTimeSpan-但是检查参数是:
public Timer(
TimerCallback callback,
object state,
TimeSpan dueTime,
TimeSpan period
)
i、 最后一个参数应该是重复周期。
因为您提供了一个无限周期,计时器将不会再次触发
如果这是每日设置,则应该类似于TimeSpan.FromHours(24.0)。为计时器构造函数提供的最后一个参数是Timeout.InfiniteTimeSpan-但是检查参数是:
public Timer(
TimerCallback callback,
object state,
TimeSpan dueTime,
TimeSpan period
)
i、 最后一个参数应该是重复周期。
因为您提供了一个无限周期,计时器将不会再次触发
如果这是每日的,那么它应该类似于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次,但每次都会运行。您可以使用以下代码段而不是计时器:
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次,但每次都会运行。似乎作为计划任务可以更好地完成此任务。似乎作为计划任务可以更好地完成此任务。