我正在使用 .net 远程调用功能,并且有一些东西我无法弄清楚,也无法在 Google 上找到答案,那就是对象销毁的工作方式。
我试图在远程调用中实现某种对象池,在此过程中,我有一个静态对象列表,它们基本上是一个字符串和一个布尔状态指示器。
当我请求一个新的远程对象(在构造函数期间),我检查池中是否有空闲对象,将其标记为“正在使用”,并在对象销毁期间调用 DismisObject,将其简单地标记为“可用”。
超时设置正常 - 如果我在5分钟内没有活动,当我尝试使用对象时,我会得到远程异常,但是~MyRemotableObject()而不是Dispose()函数没有被调用,因此对象从未在池中标记为自由。即使我关闭程序 - 对象仍然保持在池中处于活动状态。唯一的方法是手动调用Dispose函数(如果程序崩溃或用户离开打开状态,则无法执行此操作)。
有没有办法强制.NET在关闭连接时处理掉/销毁对象? (我在某个地方发现CG应该偶尔这样做,所以我打开了4个客户端并崩溃了其中2个 - 另外2个在一段时间后断开连接,但对象仍标记为活动状态)
我试图在远程调用中实现某种对象池,在此过程中,我有一个静态对象列表,它们基本上是一个字符串和一个布尔状态指示器。
当我请求一个新的远程对象(在构造函数期间),我检查池中是否有空闲对象,将其标记为“正在使用”,并在对象销毁期间调用 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个在一段时间后断开连接,但对象仍标记为活动状态)