4

私は.netリモーティング機能で遊んでいますが、Googleで理解も答えも見つからないことがあり、オブジェクトの破棄がどのように機能するかを示しています。

基本的に文字列とブール状態のインジケーターである静的オブジェクトのリストを作成するために、リモーティングを使用してある種のオブジェクトプーリングを実装しようとしています。

新しいリモートオブジェクトを要求するとき(コンストラクターの実行中)、プールに空きがあるかどうかを確認し、使用中およびオブジェクトの破棄中にプールにマークを付けます。DismisObjectは、単に「無料」としてマークします。

  public class MyRemotableObject : MarshalByRefObject,IDisposable
{

    private AdvancedString obj;
    public MyRemotableObject()
    {
        aso = strCache.GetFreeObject();
    }
    ~MyRemotableObject()
    {
        Destroy();
    }
    public void Dispose()
    {
        Destroy();
    }
    public void SetMessage(string message)
    {
        if (obj== null) { obj= strCache.GetFreeObject(); }
        obj.str= message;
    }
    public string GetMessage()
    {
        return obj.str;          
    }
    void Destroy()
    {
        if (obj!= null)
        {
            obj.DismisObject();
            obj = null;
        }
    }
}

タイムアウトは正常に機能します-オブジェクトを使用しようとすると、5分間のアクティビティの後、リモーティング例外が発生しましたが、Dispose()関数ではなく〜MyRemotableObject()が呼び出されないため、オブジェクトがプールで空きとしてマークされることはありません。プログラムを閉じても、オブジェクトはプール内でアクティブなままです。それを解放する唯一の方法は、手動でDispose関数を呼び出すことです(たとえば、プログラムがクラッシュしたり、ユーザーが開いたままになっている場合は、これを行うことはできません)。

接続を閉じるときに.netにオブジェクトを強制的に破棄/破棄させる方法はありますか?(ある場所で、CGが時々それを行う必要があることがわかったので、4つのクライアントを開いて、2つをクラッシュさせました。他の2つはしばらくして切断されましたが、オブジェクトはまだアクティブとしてマークされています)

4

2 に答える 2

2

ITrackingHandlerを使用して、オブジェクトが切断されたときを追跡し、その時点でDisposeコードを実行することができます。

于 2009-07-06T08:36:59.103 に答える
0

using可能な限り、構成にIDisposableを実装するオブジェクトを使用してください。

例えば

using (var remotableObj = new MyRemotableObject())
{
    // use it
}

ここここでより多くの情報。

于 2009-07-06T08:24:05.480 に答える