繁体   English   中英

服务用尽TCP连接

[英]Service running out of TCP connections

我有一个Windows服务,它是使用c#.net 4.0创建的,它是一些事情的监视器-它上面有一个计时器,并且它有一个计时器,每5分钟运行一次。 因此它具有计时器控件,并且计时器中有一个Elapsed事件:

private void Timer_Elapsed(object sender, System.Events.ElapsedEventArgs e)
{
    FileMonitor fileMon = new FileMonitor(url);  

}

发生的是,在FileMonitor中,它使用TfsTeamProjectCollection类与TFS服务器项目建立了连接,如下所示:

TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(url, new NetworkCredential( username, password, domain);

发生的事情是,我认为这会在方法Timer_Elapsed结束后立即自动关闭连接,但似乎没有,服务器用尽了TCP连接,其他服务无法再连接了。

所以我的问题有两个:

  1. 在Windows服务中,如果我实例化一个新类,则该方法一结束就将其销毁,对吗?
  2. 在这种情况下,我读到TfsTeamProjectCollection并不会真正关闭连接: http ://social.msdn.microsoft.com/Forums/vstudio/en-US/a0878218-d8dd-4c2a-916f-00bc5b3be2da/tfsteamprojectcollectiondisconnect- 缺少 -如果是这种情况,那么比该帖子中所建议的解决方案更好的解决方法是什么?

总体而言,使用FileMonitor时应该对服务本身做些什么-应该手动销毁它还是让垃圾回收销毁它?

  1. 不,不是
  2. 调用Disconnect ,或者最好还是使用using关键字。

由于该类实现IDispose ,因此可以使用using关键字,如下所示:

using ( TfsTeamProjectCollection x = New TfsTeamProjectCollection(...) ) {
    ... usage
}

这将关闭连接。 回到第一点,C#没有实现像C ++这样的确定性析构函数 取而代之的是,该对象在将来的某个时候被垃圾回收 ,您对此无法控制。

因为该对象具有终结器 ,所以它保持打开状态的连接将在垃圾收集器运行时被调用。 但是,在连接用尽之前,GC尚未运行。

TfsTeamProjectCollection对象实现IDisposable,因为它使用非托管资源。 与实现IDisposable接口的任何其他对象一样,使用完该对象后,应调用dispose方法。 如果您不这样做,那么它可以保留资源。

最简单的方法是将其包装在using语句中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM