2012-02-05 69 views
5

這個代碼,增加了註冊新的事件處理程序(個),命名爲NewMail事件(EventArgs類被命名爲NewMailEventArgsEventHandler:這段代碼是怎麼回事?

// 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); 
} 

(來源:通過C#,第11章活動)CLR 我也不是什麼理解是做的一部分,首先我們將newMail分配給prevHandler,然後newMail更改(在CompareExchange中)newHandler?然後我們檢查是否newMail!= prevHandler?
我真的有點困惑。任何人都可以幫助我理解什麼究竟是在這裏,特別是在做循環?

回答

3

作爲評論說,它是提供一種安全方式來處理多線程環境中的事件。這是相當棘手的實際,但這裏的工作原理是:

  • 什麼Interlocked.CompareExchange是:if prevHandler == this.NewMail,然後this.NewMail = newHandler

  • 整個操作(比較+影響)是原子,即在做一次(不能在另一個線程的操作過程中停止)。

  • 如果NewMail不等於prevHandler,那麼就意味着另一線程已跑了相同的代碼和已修改的事件處理程序。因此,我們不會在這裏做任何事情,我們將循環,然後再試一次,希望下一次沒有其他線程已註冊的事件處理程序(下一次我們會重讀事件處理程序;現在將考慮另一個線程完成的操作)。

又見這個有用thread