私は.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つはしばらくして切断されましたが、オブジェクトはまだアクティブとしてマークされています)