gpt4 book ai didi

C# Threading.Timer 在 Windows 服务任务中并不总是触发

转载 作者:太空宇宙 更新时间:2023-11-03 19:53:23 24 4
gpt4 key购买 nike

伙计们,我正在基于 Windows 服务 .NET 中实现例程,并在其中使用 Threading.Timer 任务

protected override void OnStart(string[] args)
{
base.OnStart(args);
_startupTask = Task.Factory.StartNew(StartupAction, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
}

在我的 StartupAction 中,我定义了一个 Threading.Timer,如下所示:

private void StartupAction()
{
System.Threading.Timer infamousTimer;
infamousTimer = new System.Threading.Timer(new TimerCallback(runMeEveryHour), null, new TimeSpan(0), new TimeSpan(1, 0, 0));
}

有人会认为这很简单,但出于某种原因,它并不总是有效(在某些 PC 上有效,但在其他 PC 上无效)。

谁知道罪魁祸首或环境依赖性是什么?

谢谢

当计时器超出范围时,不会触发回调。查看下面的答案

最佳答案

您的问题在于您使用了 Task 并创建了完全包含在任务操作中的计时器:

private void StartupAction()
{
System.Threading.Timer infamousTimer;
infamousTimer = new System.Threading.Timer(new TimerCallback(runMeEveryHour), null, new TimeSpan(0), new TimeSpan(1, 0, 0));
}

我认为发生的事情是,一旦 StartupAction 完成,计时器就会超出范围并被处置/GC。

而是将计时器变量移到外面:

private Timer infamousTimer;

private void StartupAction()
{
infamousTimer = new System.Threading.Timer(new TimerCallback(runMeEveryHour), null, new TimeSpan(0), new TimeSpan(1, 0, 0));
}

这里的优势还在于 OnStop 您可以干净地处理计时器。

当然,为什么还要在 Task 中执行此操作?如果只是在 OnStart 中执行此操作也同样有效,这似乎有些矫枉过正。

我还想指出,如果所有服务都运行一个计时器,那么您最好使用计划任务,但我在此做一个假设。

参见 this blog post为什么。

关于C# Threading.Timer 在 Windows 服务任务中并不总是触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36166341/

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