C#中的远程调用和析构函数

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分钟内没有活动,当我尝试使用对象时,我会得到远程异常,但是~MyRemotableObject()而不是Dispose()函数没有被调用,因此对象从未在池中标记为自由。即使我关闭程序 - 对象仍然保持在池中处于活动状态。唯一的方法是手动调用Dispose函数(如果程序崩溃或用户离开打开状态,则无法执行此操作)。
有没有办法强制.NET在关闭连接时处理掉/销毁对象? (我在某个地方发现CG应该偶尔这样做,所以我打开了4个客户端并崩溃了其中2个 - 另外2个在一段时间后断开连接,但对象仍标记为活动状态)
2个回答

2
您可以可能使用ITrackingHandler来跟踪对象何时断开连接,然后在那一点运行Dispose代码。

0
尽可能在using结构中使用实现IDisposable的对象。
例如:
using (var remotableObj = new MyRemotableObject())
{
    // use it
}

更多信息请点击这里这里


谢谢,但我不认为我可以在这里使用“using”,因为我在事件中使用对象(例如-当OnTextChange发生时,我调用SetMessage),稍后我想使用它返回一个真正的对象(而不仅仅是一个字符串) 我需要能够在.NET(强制)关闭与客户端的连接时运行一些命令,或者至少能够在服务器端安排GC。 - SimSimY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接