我有一个Windows服务,使用c#.net 4.0创build,这是一个监视器的几件事情 – 它有一个计时器,它有一个计时器,每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);
发生了什么事情,我认为这将自动closures连接方法Timer_Elapsed结束,但似乎并没有和服务器用完TCP连接,其他服务无法连接了。
所以我的问题是双重的:
总的来说,当我使用FileMonitor时,我应该怎样做服务本身 – 我应该手动销毁它,还是让垃圾收集销毁它?
Disconnect
,要么仍然使用using
关键字。 由于类实现了IDispose
,因此可以使用如下所示的using
关键字:
using ( TfsTeamProjectCollection x = New TfsTeamProjectCollection(...) ) { ... usage }
这将关闭连接。 回到第一点,c#没有实现象C ++这样的确定性析构函数 。 相反,物体在未来的某个时间点会被垃圾收集 ,而这些垃圾是有限/无法控制的。
因为该对象有一个终结器 ,它保持打开的连接将在垃圾收集器运行时被调用。 但是,在连接不足之前GC没有运行。
TfsTeamProjectCollection对象实现了IDisposable,因为它使用非托管资源。 与其他任何实现IDisposable接口的对象一样,在完成使用时应该调用dispose方法。 如果你不这样做,它可以坚持资源。
最简单的方法是将其封装在using语句中。