gpt4 book ai didi

c# - Windows 服务中的计时器在一两天后停止触发,GC 或错误逻辑?

转载 作者:行者123 更新时间:2023-11-30 21:00:50 27 4
gpt4 key购买 nike

我有一个小的 Windows 服务,它应该在一天中的不同时间以用户设置的固定时间间隔将一些数据写入 Web 服务。

例如。 8:00-22:00 每20分钟一类

但是在大​​约 10 次触发回调后,计时器就停止了,事件日志中没有任何内容,服务工作正常,这意味着没有异常使他崩溃。

代码很简单:

private Dictionary<string, Timer> m_timers = new Dictionary<string, Timer>();

protected override void OnStart(string[] args)
{
// load settings

foreach(var settings in userSettings)
{
SetUpTimer(settings);
}
}

private void Callback(Settings settings)
{
try
{
//Write some data to web service
//Write to event log that web service write suceeded
}
catch(Exception ex)
{
//Write to event log
}

SetUpTimer(settings);
}

private void SetUpTimer(Settings settings)
{
Timer timer;

if (m_timers.ContainsKey(settings.Name))
{
timer = m_timers.Where(x => x.Key == settings.Name).Select(x => x.Value).FirstOrDefault();
// Dispose timer (there is rumor that it can slide after few days), just to be sure.

if (timer != null)
timer.Dispose();
}

TimeSpan timeToFirstRun = settings.TimeFrom - DateTime.Now.TimeOfDay;

while (timeToFirstRun.TotalHours < 0 || timeToFirstRun > settings.TimeTo)
{
timeToFirstRun += TimeSpan.FromMinutes(settings.EveryHowMuch);
}

if (timeToFirstRun > settings.TimeTo)
timeToFirstRun = settings.TimeFrom - DateTime.Now.TimeOfDay + TimeSpan.FromDays(1.0);

timer = new Timer(Callback, settings, timeToFirstRun, new TimeSpan(-1));

if (!m_timers.ContainsKey(settings.Name))
{
m_timers.Add(settings.Name, timer);
}

// Write to event log that it sucessfully set up for next callback
}

最佳答案

好吧,你这里有一个很大的缺陷:

您处理了一个计时器,但没有将其从 m_timers 中删除。新创建的具有此名称的计时器将永远不会添加到字典中,因此会在某个时候被 GC 收集。

此外,您应该结合使用 TryGetValue 而不是 ContainsKey 与 LINQ 查询。

您的方法的顶部应如下所示:

Timer timer;
if(m_timers.TryGetValue(settings.Name, out timer))
{
timer.Dispose();
m_timers.Remove(settings.Name);
}

关于c# - Windows 服务中的计时器在一两天后停止触发,GC 或错误逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14684198/

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