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 に答える