gpt4 book ai didi

c# - Windows 服务应用程序挂起

转载 作者:可可西里 更新时间:2023-11-01 10:01:28 26 4
gpt4 key购买 nike

背景:
- 运行 Window Server 2008 R2。
- 服务器已使用所有最新更新进行修补。
- 服务器正在运行 5 个内置于 .NET 3.5 中的服务,所有这些服务都使用计时器重复检查数据库(主要是每 10 秒一次)。
- 这些服务不是 CPU/RAM 密集型。
- 服务器没有任何性能和资源问题或瓶颈。

在大多数情况下,一切都按预期运行,但有时,某些(或所有)服务会停止工作。我正在将所有应用程序异常记录到文件中,但在失败时没有任何异常。事件记录器中也没有错误,服务管理器将服务视为正在运行。我必须停止服务并再次启动它们才能恢复功能。

这种行为是不可预测的,有时需要一周或一个月才能停止工作。此外,有时服务会一起“死亡”,或者同时“死亡”其中的一部分。

我唯一想到的是 Timer 对象。我一直在使用 System.Timers.Timer 并发现几个论坛线程指出它不可靠,因为垃圾收集器可能会释放实例。我尝试使用 GC.KeepAlive() 保留它但无济于事。我遵循了一些关于将 System.Timers.Timer 移动到 System.Threading.Timer 的建议,但这也没有任何区别。

此刻,我非常想找出这种行为的根源。是否有任何已知的类似问题?当没有引发异常并且事件日志也没有提示时,我该如何调试它?

感谢您提供可能导致任何解决方案的任何建议。

更新:包括当前状态的基本代码:

private System.Threading.Timer timerPublish = null;
private bool timerDelegateMethodRunning = false;

protected override void OnStart(string[] args)
{
SetupTimer();
}

protected override void OnStop()
{
if (timerPublish != null)
{
timerPublish.Dispose();
}
}

public void SetupTimer()
{
if (timerPublish != null)
{
timerPublish.Dispose();
}
TimerCallback callbackMethod = new TimerCallback(this.timerPublish_Elapsed);
timerPublish = new System.Threading.Timer(callbackMethod, null, 5000, 5000);
}

void timerPublish_Elapsed(Object stateInfo)
{
if (timerDelegateMethodRunning)
{
return;
}
timerDelegateMethodRunning = true;

try
{
// Processing code here
}
finally
{
timerDelegateMethodRunning = false;
}
}



更新 2:感谢你们的见解和建议。一旦问题再次发生,我将尝试调试生产服务器上的服务。我会在有任何新消息后立即报告(可能在几周内)。

最佳答案

为什么要使事情复杂化? :) 准备就绪后,只需使用 Timer.Change() 方法再次触发计时器。

还知道 WorkerMethod 中任何未捕获的异常 都会 f*ckup 您的服务。

public class YourService
{
private System.Threading.Timer _timer;

protected override void OnStart(string[] args)
{
//run once in 5 seconds.
_timer = new System.Threading.Timer(WorkerMethod, null, 5000, Timeout.Infinite);
}

protected override void OnStop()
{
if (_timer != null)
{
_timer.Dispose();
_timer = null;
}
}

void WorkerMethod(object state)
{
// Processing code here

_worker.Change(5000, Timeout.Infinite); //Run again in 5 seconds
}
}

更新

我看到你在哪里使用 System.Timers.Timer。它最大的问题是它忽略异常。也就是说,如果您的代码抛出异常而您没有捕获它:您永远不会意识到该异常。这很可能是您的问题。

关于c# - Windows 服务应用程序挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5288203/

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