gpt4 book ai didi

C# 在 55 秒标记处每分钟调用一次方法

转载 作者:行者123 更新时间:2023-11-30 20:46:34 24 4
gpt4 key购买 nike

我接到一项任务,要编写一个程序来计算从我们网站请求的页面浏览量。我目前的方法是从谷歌分析实时 API 获取数据,这让我大吃一惊。

我的问题是,为了每分钟获得综合浏览量,我需要从 google API 轮询数据两次(因为它返回最后 29 分钟的总和 + 来自每分钟重置的计时器的值)。在我设置“重置点”之后,可以说,在每分钟的第 55 秒,我在第 56 秒和稍后的第 53 秒轮询数据,这让我对新用户/请求的页面浏览量有了相对较好的估计。

所以这是我目前的做法:

static System.Timers.Timer myTimer = new System.Timers.Timer();
myTimer.AutoReset = false;
myTimer.Interval = interval();
myTimer.Elapsed += myTimer_Elapsed2;
myTimer.Start();

static double interval()
{
return 1000 - DateTime.Now.Millisecond;
}

static void myTimer_Elapsed2(object sender, System.Timers.ElapsedEventArgs e)
{
if (DateTime.Now.Second == (resetPoint.Second - 1) % 60 && warden)
{
DoStuff(); //mostly inserting google API data to database
}
else if (DateTime.Now.Second == (resetPoint.Second + 1) % 60) //so we dont get riddiculous 60 and above
{
//I get some data here, to later use it in DoStuff - mostly to calculate the gap between later
}
myTimer.Interval = interval(); //Because DoStuff() takes about 0.5 sec to execute, i need to recalibrate
myTimer.Start();
}

它工作得很好,直到大约 2 小时后停止,现在我不知道为什么(程序运行,只是计时器不再工作)。

如何使其长期稳定?最好的情况是在没有干预的情况下运行数月。

@我编辑是为了更好地理解我实际上在做什么

@结束学分

我最终使用了两个计时器,每个计时器运行一分钟。而且一个数据库写入有时会崩溃,我没有正确处理相应的异常。 Log 告诉我,谷歌 API 函数有时倾向于检索数据的时间稍长,这导致多次 Threading.Event 调用并使我的数据库数据处理抛出异常,从而停止计时器。

我尝试使用 Quartz 方法,但它缺乏人性化的方法让我放弃了这个库。

最佳答案

您真的应该考虑使用 Quartz.net 在可靠的基础上安排事件。使用计时器进行调度需要解决竞争条件、事件跳过和数据库死锁等问题。

http://www.quartz-scheduler.net/允许您以精确的时间间隔安排事件,而与您的代码何时开始或停止无关。

有关如何使用它的示例:这将构建一个触发器,该触发器将在下一个小时的顶部触发,然后每 2 小时重复一次,直到永远:

trigger = TriggerBuilder.Create()
.WithIdentity("trigger8") // because group is not specified, "trigger8" will be in the default group
.StartAt(DateBuilder.EvenHourDate(null)) // get the next even-hour (minutes and seconds zero ("00:00"))
.WithSimpleSchedule(x => x
.WithIntervalInHours(2)
.RepeatForever())
// note that in this example, 'forJob(..)' is not called
// - which is valid if the trigger is passed to the scheduler along with the job
.Build();

scheduler.scheduleJob(trigger, job);

http://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/simpletriggers.html有几个例子。我强烈建议您使用它,因为它将大大简化开发。

关于C# 在 55 秒标记处每分钟调用一次方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26737725/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com