到这时,彼得终于可以送一口气了,他成功地满足了所有监听者的需求,同时避免了与特定实现的紧耦合。但是他注意到他的老板和宇宙都为它的工作打了分,但是他仅仅接收了一个分数。面对多个监听者,他想要“收获”所有的结果,于是他深入到代理里面,轮询监听者列表,手工一个个调用:
public void DoWork() { ...Console.WriteLine("“工作: 工作完成”");
if( completed != null ) { foreach( WorkCompleted wc in completed.GetInvocationList() ) { int grade = wc();Console.WriteLine(“工人的工作得分=” + grade);
} } }
异步通知:激发 & 忘掉
同时,他的老板和宇宙还要忙于处理其他事情,也就是说他们给彼得打分所花费的事件变得非常长:
class Boss { public int WorkCompleted() { System.Threading.Thread.Sleep(3000);Console.WriteLine("Better..."); return 6; /* 总分为10 */
}} class Universe { static int WorkerCompletedWork() { System.Threading.Thread.Sleep(4000); Console.WriteLine("Universe is pleased with worker's work"); return 7; } ...}
很不幸,彼得每次通知一个监听者后必须等待它给自己打分,现在这些通知花费了他太多的工作事件。于是他决定忘掉分数,仅仅异步激发事件: