日期:2014-05-18  浏览次数:20651 次

恳求帮忙解决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(委托已经失效)