在remoting里使用客户端调用

如果在remoting里,服务端要调用客户端的方法,则必须首先客户端要订阅服务端的事件,并把一个方法委托传给服务端。

但是有时客户端发生异常退出了,而服务端并不知道,那么这是服务端再调用客户端的方法委托,就会报错,然后就会退出。

下面的方法可以解决这个问题,首先获得服务端的调用委托链表,检查每一个,对于没有响应的就删除。

首先客户端要有方法供服务端调用,于是客户端必须实现接口,其中ServiceEventArg类是一个包含服务端事件信息的类:

// 客户端要实现的接口
public   interface  IClientEvent
{
     
void handleEvent(object sender, ServiceEventArg e);
}

服务端要有这个接口里的方法委托申明,这样才能调用:

 

// 服务端的委托申明,和客户端的接口中的方法一样
public   delegate   void  ServiceEvent( object  sender, ServiceEventArg e);

然后在服务端的远程对象中,加入这几个方法,分别用于订阅、取消订阅、和触发订阅到服务端的所有委托

 

// 服务端的远程对象
public   class  RemoteManager : System.MarshalByRefObject
    
{
        
public static event ServiceEvent se;
        
        
//订阅到服务端
        public void ConnectToServiceEvent(IClientEvent c)
        
{
            se 
+= new ServiceEvent(c.handleEvent);
        }


        
//取消订阅
        public void DisConnectToServiceEvent(IClientEvent c)
        
{
            se 
-= new ServiceEvent(c.handleEvent);
        }


        
//依次调用订阅的方法
        public void fireEvent(object sender,ServiceEventArg e)
        
{
            
if (se != null)
            
{
                Delegate[] target 
= se.GetInvocationList();
                
foreach (ServiceEvent client in target)
                
{
                    
try
                    
{
                        client(sender, e);
                    }

                    
catch
                    
{
                        se 
-= client;
                    }

                }
                                
            }

        }

  }

 此外,ServiceEventArg这个类由于要从服务端传到客户端,所以这个类必须标记为 [Serialible]。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值