首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

恳求帮忙解决remoting开发中遇到的一个难题解决办法

2012-03-21 
恳求帮忙解决remoting开发中遇到的一个难题在remoting开发中,客户端订阅了服务端的事件,但在客户端退出时

恳求帮忙解决remoting开发中遇到的一个难题
在remoting开发中,客户端订阅了服务端的事件,但在客户端退出时没有取消事件订阅,如果服务器端触发事件的时候找不到事件订阅者,就会产生错误。
在网上有一个普遍的解决方法,就是遍历委托链,找到异常的对象,从委托链中卸下。比如如下代码:
                        if   (MyEvent!=null)  
                        {  
                                foreach(Delegate   d   in   MyEvent.GetInvocationList())
                                {
                                        try
                                        {
                                                ((MyEventHandler)d)(this,e);  
                                        }
                                        catch
                                        {
                                                MyEvent-=(MyEventHandler)d;
                                        }
                                }
                        }  
当然,这样做能达到程序不出错。但是还有一个缺陷(就是难题的所在),当遇到执行   ((MyEventHandler)d)(this,e)语句   ,产生异常然后执行catch语句释放委托。问题就在于try   与   catch之间有时间差(约2秒),换句话说就是客户端会滞后约2秒,如果有多个客户端出现这种情况,滞后时间就更长。在实际应用中,10个客户端,服务器很繁忙时,最长出现过2份钟的滞后。
可能你会说,只要客户端退出时显式地释放连接就无问题了,当然,程序会做到这一点,但有些时候会有意外,例如客户端突然断电(服务器有ups),重新启动客户端时就要一个一个地catch.....那时客户端会滞后一段时间,客户就有很大意见。

我想请教大家:
(1)有什么办法能使try一出错就马上执行catch语句?
(2)有没有更主动的方法,判断委托是否已经失效:
                                foreach(Delegate   d   in   MyEvent.GetInvocationList())
                                {
                                        try
                                        {  
                                                if(委托已经失效)
                                                {
                                                        MyEvent-=(MyEventHandler)d;



                                                }
                                                else
                                                {    
                                                        ((MyEventHandler)d)(this,e);  
                                                }
                                        }
                                        catch
                                        {
                                                MyEvent-=(MyEventHandler)d;
                                        }
                                }

恳求大家帮帮忙。谢谢!!
         


[解决办法]
也看过,写过这样的Demo,没有找到更好的办法,除非加一个心跳事件,用线程隔一段时间产生一个事件,如果客户端收到这个事件后就执行相应的事件给服务端一个回应,如果没有就释放,
[解决办法]
up
[解决办法]
帮你up
[解决办法]
mark 学习
[解决办法]
为什么要用委托链 你既然可以用链为什么不反过来想拆分了链或者根本不做链
一个一个做就是了
[解决办法]
没用过Remote,没有非阻塞的调用方式吗?
如果可以的话不要用Remote,自己用TCP或者UDP,灵活性更好。
[解决办法]
不好意思 。 刚刚又看了下。。。 疏忽。。。

象前面那位仁兄说的一样,可以开一个异步线程在异步回掉中处理掉无效委托.而且你并不需要异常信息只需要处理掉无效委托。

http://www.cnblogs.com/peterzhou/articles/307898.html
这里有完整的代码+说明你仔细看看吧。
在最下面“异步操作”这一节。
回家吃饭。
[解决办法]
cs_lyl() ( ) 信誉:99
说的有道理,你可以建立临时表,来存放关联信息,然后在每隔时间检测一次,整理关联表
[解决办法]
高手啊,都是 正在学

热点排行