恐怕您的意思确实不清楚,但是如果委托有可能为null,则需要在每个线程上分别进行检查。通常,您会这样做:
public void onSeven(){ DivBySevenHandler handler = EventSeven; if (handler != null) { handler(...); }}这样可确保即使您
EventSeven在执行过程中进行更改
onSeven()也不会得到任何帮助
NullReferenceException。
但您说对了,如果您确实有订阅处理程序,就不需要null检查。这可以在C#2中使用“无操作”处理程序轻松完成:
public event DivBySevenHandler EventSeven = delegate {};另一方面,如果您可能从各种线程获得预订,则 可能
需要某种锁定只是为了确保您拥有“最新”的处理程序集。我的线程教程中有一个示例可以提供帮助-
尽管通常我建议您尽量避免使用它。
在垃圾回收方面,事件 发布者 最终会引用事件 订阅者 (即处理程序的目标)。仅当发布者的寿命要长于订阅者时,这才是问题。



