这段代码添加了用于名为
NewMail
的事件的新EventHandler(s)
(事件参数类名为NewMailEventArgs
)。// A PUBLIC add_xxx method (xxx is the event name)
// Allows methods to register interest in the event.
public void add_NewMail(EventHandler<NewMailEventArgs> value) {
// The loop and the call to CompareExchange is all just a fancy way
// of adding a delegate to the event in a thread-safe way.
EventHandler<NewMailEventArgs> prevHandler;
EventHandler<NewMailEventArgs> newMail = this.NewMail;
do {
prevHandler = newMail;
EventHandler<NewMailEventArgs> newHandler = (EventHandler<NewMailEventArgs>)Delegate.Combine(prevHandler, value);
newMail = Interlocked.CompareExchange<EventHandler<NewMailEventArgs>>(ref this.NewMail, newHandler, prevHandler);
}
while(newMail != prevHandler);
}
(来源:CLR via C#,第11章 事件)
我不理解的是do部分,首先我们将newMail赋值给prevHandler,然后newMail在CompareExchange中被更改为newHandler?然后我们检查newMail!= prevHandler吗?
我真的有点困惑。有人能帮我理解这里到底发生了什么,特别是在do循环中吗?