1. 将每个CAO对象的实例记录在一个SINGLETON中,需要时想SINGLETON对象获取某个实例,然后通过次实例的EVENT或CALLBACK就可以实现SERVER与CLIENT间的交互。2. CAO类实现System.Runtime.Remoting.Services.ITrackingHandler,然后通过System.Runtime.Remoting.Services.TrackingServices.RegisterTrackingHandler注册,当客户端关掉或断线后,CAO对象在租约结束后就会调用DisconnectedObject, 可以在此方法中去掉在SINGLETON中的记录。以上方法我只是部分尝试过,希望能帮到你。

解决方案 »

  1.   

    先谢谢你的回答,我还是有点问题1:   "将每个CAO对象的实例记录在一个SINGLETON中".
    这个操作只能在客户端进行是吗?那是不是每次服务器端调用CAO对象都要往返两次行程,我也想到了,但是总感觉不是很好。2 这一部分我还没有看太懂,但是还是有点不太好,就像SESSION一样,必须过了租约期才能引发事件。这样很可能CAO实例还没有被破坏掉,客户又重新登陆上来造成麻烦。 如果是服务器主动去查找就好了。
      

  2.   

    看来,你已用到租约期了。我在另外一个帖上说的可能迟了。客户马上重新登录,倒是一个麻烦。解决的方法,在创建 CAO 对象的构造函数中,根据用户的特征数据,判断一下当前用户集合中是否已有相同特征的 CAO 对象存在,如果已有先例存在,调用一下 Dispose() 方法。此 Dispose 方法的实现需要琢磨一下。也可以用另外一个 Singleton 对象(CAOGenerator)的实例方法:
               CAO CAOGenerator.GetCAO(“用户特征参数”)
    来返回 CAO 对象,GetCAO 可以实现判断算法来决定是返回一个已存在的 CAO 对象,还是创建一个新 CAO 对象。可能此方法比较合适。返回已存在的 CAO 对象时,要考虑到其 CurrentLeaseTime 是否有足够的时间等待客户端的 Renew 申请。这时就需要用到 ISponsor,完美的解决方案需要 ILease.Renew 和 ISponsor.Renewal 双管齐下。通讯正常的情况下,如果时间配合得当,ILease.Renew 能够得到正确的执行,ISponsor.Renewal 执行的机会几乎没有。只有在租约到期了,服务器要查询是否能回收 CAO 对象时,才会查询 ISponsor.Renewal 的返回值。另外可以采用一个双向通道,CAO 对象由聊天客户端创建,然后上传给聊天服务端,这样聊天客户端成了 CAO 对象的服务端,而聊天服务端成了 CAO 对象的客户端。这样就可以由聊天客户端来控制 CAO 对象的生存期租约了。这种方式,就跟原来的方式完全不同了。行与不行,还有待研究。最近,我也迷上了 Remoting 了。我对此技术甚有好感,一起学习。