可能由于GC on Timer而意外停止服务

时间:2014-10-29 20:21:17

标签: c# .net timer garbage-collection

我公司开发了Windows服务应用程序,并在一些客户中安装。 他们抱怨服务在连续运行几天后停止。

我无法重现错误,我没有任何堆栈跟踪。我所拥有的只是事件查看器中的通用消息:

  

'myservicename'服务意外终止。它已经完成了这一次。

我的代码:

private System.Timers.Timer myTimer;
private readonly Queue<FileInfo> MyQueue = new Queue<FileInfo>();

protected override void OnStart(string[] args)
{
   myTimer = new System.Timers.Timer(1000 * 60 * 1); // 1 min
   myTimer.Elapsed += new ElapsedEventHandler(MyMethod);
   myTimer.Start();

   SomeSafeTasks();

   try
   {
      CreateSomeThreads();
   }
   catch(Exception)
   {
      //log
   }
}

public void MyMethod()
{
   lock (MyQueue) // there are other places with lock
   {
      if(MyQueue.Count == 0)
      {
         // code with try catch
      }
   }
}

我认为该错误与定时器被GC相关。

  1. 有意义吗?运行几天后上面的代码可能会中断?
  2. 我如何估计它何时会破裂?它对我来说很奇怪,它运行了一个星期。我希望它能在15分钟或1小时内完成GC。
  3. GC.KeepAlive(myTimer)之后添加myTimer.Start()是否100%安全?
  4. 它会永远 ,还是有时需要致电GC.KeepAlive

0 个答案:

没有答案