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