如何安全地启动事件当事件没有订阅者时,如何保证事件触发时不会抛出异常。//委托声明publicdelegatevoid_delDisplayChange(objectsender,stringoption);//事件声明publicevent_delDisplayChangeDisplayChange;//抛出事件DisplayChange(this,"DISTRIBUTION");以下是推荐的方法:protectedvoidRaiseDisplayChanged(stringmessage){varhandlers=DisplayChange;如果(处理程序!=null)处理程序(这个,消息);在检查两件事之前复制事件处理程序枚举:如果DisplayChange处理程序在检查和触发之间变为null,它不会死如果侦听器在枚举时修改DisplayChange列表,您将不会遇到奇怪的情况。此外,您没有使用标准事件协议。您的代表应该是:publicdelegatevoidDisplayChangeDelegate(objectsender,OptionsEventArgsargs);其中OptionsEventArgs派生自EventArgs。更进一步,在.Net3.5中你永远不应该定义这样的委托。相反,你应该只定义你的事件:publiceventEventHandlerDisplayChanged;我想通过定义此类更进一步:publicclassEventArgs:EventArgs{publicTPayload{get;私有集}publicEventArgs(Tpayload){Payload=payload;然后,您不需要定义OptionsEventArgs:publiceventEventHandler>DisplayChanged;只是在想一些事情……改变这个://事件声明publicevent_delDisplayChangeDisplayChange;为此://事件声明publicevent_delDisplayChangeDisplayChange=delegate{};这将确保您的活动始终至少有一个订阅者。正如Brian所说:许多消息来源建议在检查事件是否为空之前复制事件:_delDisplayChangedisplayChangeCopy=DisplayChange;if(displayChangeCopy!=null)displayChangeCopy(this,"DISTRIBUTION");这有助于使您的代码更加线程安全,因为displayChangeCopy的值在null检查和调用之间不会更改。在Jay的回答之后,这里有一个关于使用空委托时的性能注意事项的链接。以上就是《C#学习教程:如何安全启动事件》的全部内容。如果对你有用,需要进一步了解《C#学习教程》,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
