我正在使用.net远程处理功能,有一些我无法弄清楚,也没有在谷歌找到答案,以及对象处理的工作原理.
我尝试使用远程处理实现某种对象池,因为我列出了基本上是字符串和布尔状态指示符的静态对象.
当我请求一个新的远程对象(在consturctor中)时,我检查一个免费的对象,将其标记为在使用中和在对象的破坏期间. 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分钟后我得到了远程异常但是~MyRemotableObject()没有调用Dispose()函数,所以对象永远不会在池中被标记为空闲.即使我关闭程序 – 仍然对象在池中保持活动状态.释放它的唯一方法是手动调用Dispose函数(如果程序崩溃或用户离开,我无法执行)
有没有办法强制.net在关闭连接时处置/销毁对象?
(我在某个地方发现CG应该偶尔这样做,所以我打开了4个客户端并且崩溃了2个 – 其他2个在一段时间后断开连接但是objcets仍然标记为活动状态)
最佳答案 您可以使用
ITrackingHandler跟踪对象断开连接的时间,然后在该点运行Dispose代码.