我正在使用 .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 分钟活动后,我得到了远程处理异常,但是 ~MyRemotableObject() 而不是 Dispose() 函数没有被调用,因此该对象永远不会在池中标记为空闲。即使我关闭程序 - 对象仍然在池中保持活动状态。释放它的唯一方法是手动调用 Dispose 函数(如果程序崩溃或用户离开是打开的,我不能这样做)
有没有办法强制 .net 在关闭连接时处理/销毁对象?(我在某个地方发现 CG 应该偶尔这样做,所以我打开了 4 个客户端并让 2 个崩溃 - 其他 2 个在一段时间后断开连接,但对象仍然标记为活动)