为什么我不应该使用GC.Collect()

时间:2011-04-20 11:07:31

标签: c# .net garbage-collection certificate-authority

我正在开发一个应用程序,我使用CertAdm.dll来建立与证书颁发机构的连接。有时我会收到错误“尝试打开证书颁发机构数据库会话,但已经有太多活动会话。服务器可能需要配置为允许其他会话。”

如果我像下面的代码一样配置我的连接,我就不会收到错误,一切正常。

CERTADMINLib.ICertView2 cv2 = new CERTADMINLib.CCertViewClass();

try
{
    cv2.OpenConnection(srtCAConfig);
}
catch
{
    GC.Collect();
    GC.WaitForPendingFinalizers();
    cv2.OpenConnection(srtCAConfig);
}

现在我想知道的是,我已经阅读了很多人说你不应该使用GC.Collect()。我为什么不应该?它解决了我的问题?

非常感谢所有帮助。

3 个答案:

答案 0 :(得分:4)

简短回答:垃圾收集越多,效率越低。

等待待定的终结者也是不受欢迎的。您正在阻止代码等待未知数量的对象执行可能需要一段未知时间的清理操作。如果你修复了潜在的问题,就没有必要等待它们中的任何一个。

对于潜在的问题,当一个对象拥有一些外部(稀缺)资源时,重要的是当你完成它时,你调用适当的方法来释放资源。通常,这是一个名为Dispose(),CloseConnection()或类似的方法。

但是,这是一个COM互操作对象,所有MSDN都说是

  

要关闭连接,请调用Release函数(C ++)或将对象设置为Nothing(Visual Basic)。

在.NET中,等效于调用System.Runtime.InteropServices.Marshal.ReleaseComObject(cv2)。完成后,cv2引用的对象无效,所以不要再次调用它。

答案 1 :(得分:0)

也许它解决了你的问题,因为你班上的连接工作不正确。

尝试检查应用中的所有连接,查看它们的打开位置以及关闭位置 - 我认为您不会关闭连接/不清除连接使用的资源。

答案 2 :(得分:0)

我认为你打开它们后没有关闭连接,最后它超过了一次可以打开的最大连接数。当您提供GC.Collect()时,每次强制收集连接对象时,您都无法重用已打开的连接。