服务耗尽TCP连接

时间:2013-09-06 21:07:32

标签: c# asp.net windows service tfs

我有一个使用c#.net 4.0创建的Windows服务,这是一个监视器,它有一个计时器,它有一个计时器,每隔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-missing- - 如果是这样的话,有什么比这篇文章中建议的更好的方法来处理它?
  3. 总的来说,在使用FileMonitor时我应该为服务本身做些什么 - 我应该手动销毁它,还是让垃圾收集破坏它?

2 个答案:

答案 0 :(得分:3)

  1. 不,它没有
  2. 请致电Disconnect,或者更好地使用using关键字。
  3. 由于该类实现了IDispose,因此您可以使用using关键字,如下所示:

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

    这将关闭连接。回到第一点,c#没有像C ++那样实现deterministic destructors。相反,对象在将来的某个时刻是garbage collected,你有限/无法控制。

    因为对象有一个finalizer它保持打开的连接,所以当垃圾收集器运行时会调用它。但是,在连接用完之前GC没有运行。

答案 1 :(得分:2)

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

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