为什么在超出范围时不会关闭SqlConnection

时间:2015-02-25 08:16:37

标签: garbage-collection unmanaged managed sqlconnection

Microsoft声明,“如果SqlConnection超出范围,则不会关闭”。我根本不明白这一点。 SqlConnection是一个ADO.NET 托管对象,即使它在幕后使用非托管资源,为什么垃圾收集器不清理它?当它超出范围时,它应该被销毁。有人可以对此有所了解,它正在打破我的大脑。

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.close%28v=vs.110%29.aspx

由于

1 个答案:

答案 0 :(得分:1)

最终确定时,会释放SqlConnection。发生这种情况是因为它继承自Component has a finalizer that calls Dispose。最终化是垃圾收集的一个步骤。垃圾收集非确定性地运行,即每当CLR感觉像它时。 Garbage collection in C# is totally unrelated to an object going out of scope

因此,如果SqlConnection超出范围,它将在未来的某个时刻完成并因此关闭。这很糟糕,因为在最终确定之前,你就是在浪费资源。稍后在您的程序中,您可能无法打开连接,因为已经打开了太多连接(即使它们实际上没有使用,只是等待最终确定)。

这就是为什么强烈建议您在使用完SqlConnections后处置它们。

(不要将其视为SqlConnection终结的工作原理。我简化了细节,以便专注于最终化和显式处理之间的区别。)