.net 委托(委托链)的若干“陷阱”[续]
作者:网络转载 发布时间:[ 2013/6/18 9:45:00 ] 推荐标签:
看过上篇博文的话,具体的测试结果大家可能已心中有数。即当主题发布“毛毛雨”时,学校和公司两个主题依次收到了通知。主题发布“飓风”消息时,学校收到了通知,而公司却没有。如下图:
本例中主题使用委托作为载体,发送消息通知。如DelegateSubject.Notify方法所示,发送新消息时调用委托实例 tempNotifyHander(Message)。可以看出委托的调用形式和调用方法一样(但形似神不似)。在这里,委托实例上注册了两个观察者的NewMessage方法,形成了委托链。在委托实例被调用时,委托链中的方法依次调用。
结论:
调用委托并不像调用方法一样简单,一个委托实例调用后,可以执行委托链上的多个方法;而方法仅仅是方法。
让主题的通知更健壮:
将委托像方法一样进行调用,这在用法上是没有问题的。但如果你的系统对健壮性有要求,需要你把握委托调用的内部细节(如保证即使“飓风”来了,学校和公司都能收到通知)。这时,要不能“像调用方法一样简单地调用委托了”。可以尝试通过Delegate.GetInvocationList方法获取委托实例上注册的委托链,然后进行自己的处理。一个简单的处理实例如下:
//通过委托发送通知(调用观察者接收消息的方法)
public void Notify()
{
NotifyEventHandler tempNotifyHander = NotifyObservers;
if (tempNotifyHander != null)
{
//tempNotifyHander(Message);
//获取委托链
Delegate[] chain = tempNotifyHander.GetInvocationList();
foreach (Delegate item in chain)
{
try
{
item.DynamicInvoke(new object[] { Message });//依次调用委托进行通知
}
catch (Exception ex) //某个观察者接收到消息后异常了
{
Console.WriteLine(ex.InnerException.Message);//记录异常信息
continue; //继续通知下一观察者
}
}
}
}
ps:对应观察者接收事件中的阻塞问题,可以使用Delegate.BeginInvoke方法进行处理。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11