0

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

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

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

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

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

非常感谢所有帮助。

4

3 回答 3

4

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

等待未决的终结者也是不可取的。您正在等待代码等待未知数量的对象执行可能需要未知时间的清理操作。如果您解决了根本问题,则无需等待其中任何一个。

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

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

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

在 .NET 中,相当于调用 System.Runtime.InteropServices.Marshal.ReleaseComObject(cv2)。一旦你这样做了, cv2 引用的对象就无效了,所以不要再调用它了。

于 2011-04-20T11:52:05.550 回答
0

也许它解决了您的问题,因为您在课堂上使用了不正确的连接。

尝试检查您的应用程序中的所有连接,查看它们在哪里打开和在哪里关闭 - 我认为您没有关闭连接/没有清除连接使用的资源。

于 2011-04-20T11:12:11.107 回答
0

我认为您在打开连接后并没有关闭连接,最后它超过了一次可以打开的最大连接数。当你给 GC.Collect() 时,每次连接对象都会被强制收集,因此你不能重用已经打开的连接。

于 2011-04-20T11:42:39.550 回答