Windows服务应用程序挂起

背景:
- 运行Window Server 2008 R2的。
- 该服务器已修补了所有最近的更新。
- 服务器运行的是建在.NET 3.5的服务和所有这些服务使用定时器来检查重复的基础上(每10秒居多)数据库。
- 这些服务不是CPU / RAM密集型的。
- 服务器没有任何性能与资源问题或瓶颈。

对于大多数的时候,一切正常,但不时,部分(或全部)服务只是停止工作。 我记录所有的应用程序例外文件,但有没有当谈到失败。 也有在事件记录器没有错误和服务Manager将服务运行。 我不得不停止服务,并再次启动它们恢复功能。

这种行为是不可预测的,有时需要一个星期或一个月就停止工作了。 此外,有时服务“死”所有,或只在同一时间他们中的一些。

只有掠过我脑海的是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; } }

UPDATE2:谢谢你们您的见解和建议。 我会尝试调试生产服务器上的服务,一旦问题再次发生。 我会尽快我有什么新的东西(可能在数周)报到。

--------------解决方案-------------

你为什么复杂的事情? :)只是使用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 。 它最大的问题在于 ,它忽视例外 。 也就是说,如果你的代码抛出一个异常,你不抓住它: 你永远不会知道的异常。 这很可能是你的问题。

千万不要太早下定论,你知道什么是挂起的原因之前。 可以有各种令人难以置信的因素,但转储分析或现场调试可以告诉你实话,

http://blogs.msdn.com/b/tess/archive/2006/10/16/net-hang-debugging-walkthrough.aspx

如果你愿意,你甚至可以通过http://support.microsoft.com打开支持案例

我可能会建议为你服务的,反正稍微更改图案; 在这里我们有一个readonly Timer ,其中,初始分配后,只需切换得到运行,而不是产权处置是在一分钟发生的方式,也使我们自己辛苦参考TimerCallback 。 最后,我们离开的对象了的处置,以服务本身(至少从长远来看对象我们打扰约)。

虽然这种模式可能无法从你的情况一顶帽子一只白色的兔子,我可以保证以这种方式建造了许多服务的可靠性。 因此,如果执行的问题等,甚至后随之而来然后我会在说非常有信心接下来// Processing code here ,在其本身,问题的。

private readonly System.Threading.Timer Timer = null;
private readonly System.Threading.TimerCallback Callback = null;
private readonly int Interval = 5000;

public MyService()
{
Callback = new TimerCallback(this.timerPublish_Elapsed);
Timer = new System.Threading.Timer(Callback, null, Timeout.Infinite, Timeout.Infinite);
}

private void Start()
{
Timer.Change(Timespan.Zero, Interval);
}

private void Stop()
{
Timer.Change(Timeout.Inifinite, Timeout.Inifnite);
}

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

protected override void OnStop()
{
Stop();
}

public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}

private void Dispose(bool disposing)
{
if(disposing)
{
if(Timer != null)
Timer.Dispose();
}
}

分类:C# 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.849 (s). 10 q(s)