【问题标题】:Service running out of TCP connections服务耗尽 TCP 连接
【发布时间】:2013-09-11 01:49:15
【问题描述】:

我有一个使用 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- - 如果是这种情况,有什么比该帖子中建议的更好的方法来处理这个问题?

总的来说,在使用 FileMonitor 时,我应该为服务本身做些什么——我应该手动销毁它,还是让垃圾回收器销毁它?

【问题讨论】:

    标签: c# asp.net windows service tfs


    【解决方案1】:
    1. 不,它没有
    2. 要么调用Disconnect,要么最好还是使用using 关键字。

    因为类实现了IDispose,你可以像这样使用using关键字:

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

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

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

    【讨论】:

    • 比我快 29 秒
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-22
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 2022-07-24
      相关资源
      最近更新 更多