這裏是推薦的方式做到這一點:
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。 –