【问题标题】:remoting and destructors in c#c#中的远程处理和析构函数
【发布时间】:2010-11-08 07:53:34
【问题描述】:

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

【问题讨论】:

    标签: c# remoting destructor


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      例如

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

      更多信息herehere

      【讨论】:

      • 谢谢,但我不认为我可以在这里使用“使用”,因为我在事件中使用该对象(例如 - 当 OnTextChange 发生时我调用 SetMessage),稍后我想将其用于返回一个真实的对象(而不仅仅是一个字符串)我需要能够在.net(强制)关闭与客户端的连接时运行一些命令,或者至少能够在服务器端安排 GC。
      猜你喜欢
      • 2011-03-31
      • 2011-02-19
      • 2021-03-10
      • 1970-01-01
      • 2016-09-09
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 2011-04-03
      相关资源
      最近更新 更多