这里是推荐的方式做到这一点:
protected void RaiseDisplayChanged(string message)
{
var handlers = DisplayChange;
if(handlers != null)
handlers(this, message);
}
复制事件处理程序枚举检查做了两件事之前:
- 如果DisplayChange处理程序成为检查和射击之间空,你不要死
- 如果侦听器在枚举DisplayChange列表的同时修改DisplayChange列表,则不会遇到奇怪现象。
此外,您没有使用标准的事件协议。您的代表应该是:
public delegate void DisplayChangeDelegate(object sender, OptionsEventArgs args);
其中OptionsEventArgs从EventArgs派生。更进一步,在.Net 3.5中,你不应该像这样定义一个委托。相反,你应该只定义您的事件:
public event EventHandler<OptionsEventArgs> DisplayChanged;
我喜欢通过定义这个类来把它连一步:
public class EventArgs<T> : EventArgs
{
public T Payload { get; private set }
public EventArgs(T payload)
{
Payload = payload;
}
}
然后,你不需要定义OptionsEventArgs:
public event EventHandler<EventArgs<string>> DisplayChanged;
只是一些东西去思考...
我前段时间发布了一个关于这个话题的问题,并且也为它提供了相当多的火焰,但它可能是澄清一些问题的好地方:http://stackoverflow.com/questions/ 840715 /正确的方式提高事件在网络框架 –
感谢您的链接到问题 – Brad
请注意,成功地避免例外只是你的忧虑的开始,而不是结束。如果您处于多线程状态,您还需要担心是否调用陈旧事件处理程序的*完全正交*问题,并且如果是这样,请您正确处理该情况。有关详细信息,请参阅http://blogs.msdn.com/ericlippert/archive/2009/04/29/events-and-races.aspx。 –