扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:佚名 来源:论坛整理 2007年11月17日
关键字:
考虑到 .Net Remoting 客户端订阅事件的实现原理:事件重现器在客户端实例化,并由服务器对按引用方式对其
远程对象:
以下是引用片段: Code public class SayHello : MarshalByRefObject { private List reList = new List(); public void Say(string clientId, string text) { foreach (SayEventReappear re in this.reList) { if (re.ClientId == clientId) re.Say(text); } } public void AddEventReappear(SayEventReappear re) { this.reList.Add(re); } } |
客户端
以下是引用片段: sh.OnSay += new SayHandler(re.Say);改为 sh.AddEventReappear(re); |
OK,服务端分别检测每一个客户端的Id,然后只引发特定客户端的事件,真正的“定向广播”实现了。
但是
远程对象:
以下是引用片段: Code public class SayHello : MarshalByRefObject { private Dictionary reDict = new Dictionary(); public void Say(string clientId, string text) { foreach (KeyValuePair kp in this.reDict) { if (kp.Key == clientId) kp.Value.Say(text); } } public void AddEventReappear(string clientId, SayEventReappear re) { if (!this.reDict.ContainsKey(clientId)) this.reDict.Add(clientId, re); } } |
事件重现器:
以下是引用片段: Code public class SayEventReappear : MarshalByRefObject { public event SayHandler OnSay; public void Say(string text) { if (this.OnSay != null) this.OnSay(text); } } |
客户端:
以下是引用片段: sh.AddEventReappear(re);改为: sh.AddEventReappear("John", re); |
如此一来,不仅避免了对客户端的频繁调用,而且代码也更加简洁了。
当然,同利用“事件订阅”方式实现时当订阅事件的客户端退出时应该取消订阅一样,该实现中的客户端在退出时同样应该取消在服务端的“注册”。由于只是示例程序,以上代码中并没有进行取消注册处理。
但是问题恰恰出在这儿了,如果有的客户端没有自觉的取消注册或者意外退出/断线了,服务器端该如何处理呢?当然使用事件订阅时这个问题同样存在,但我估计 .Net Remoting 会根据生命周期原则适时“清除”已订阅事件而不再响应的客户端(同样是个人猜测,没有证实)。如果服务器端将连接失败的客户端直接取消注册,显然是对客户端的一种不负责任(如果客户端因临时资源紧张或临时断线无法及时响应时将被永久取消注册),但除此之外我没有想出合适的办法进行处理,总不能让已经不存在的客户端一直处于注册状态吧?!当然还有一种折中的办法是对客户端连接失败进行计数或计时,达到一定程度后认为客户已经不存在而进行注销。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者