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 个在一段时间后断开连接,但对象仍然标记为活动)

4

2 回答 2

2

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

于 2009-07-06T08:36:59.103 回答
0

using尽可能使用在构造中实现 IDisposable 的对象。

例如

using (var remotableObj = new MyRemotableObject())
{
    // use it
}

更多信息在这里这里

于 2009-07-06T08:24:05.480 回答