2012-08-25 93 views
0

之間的區別,我想確認的東西 - 當我註冊的方法爲訂戶的事件很長的路要走,就像這樣:註冊代表和註冊命名方法事件

_serviceContext.ReadingEntity += new EventHandler<ReadingWritingEntityEventArgs>(_serviceContext_ReadingEntity); 

我需要這不同於從註冊事件的訂閱,方法,如果我不希望它繼續被稱爲當事件被觸發,這樣做:

_serviceContext.ReadingEntity -= new EventHandler<ReadingWritingEntityEventArgs>(_serviceContext_ReadingEntity); 

當我註冊一個委託作爲訂戶的事件,就像這樣:

public guy ThisMethod() 
{ 
    _serviceContext.ReadingEntity += delegate(object sender, ReadingWritingEntityEventArgs e) 
     { 

     }; 
} 

無法從該方法的用戶列表中取消註冊該委託。所以我假定這個註冊的範圍僅限於它註冊的方法 - 也就是說,如果_serviceContext.ReadingEntity事件在ThisMethod調用的方法中被觸發,這個註冊將已經過期,並且委託內的代碼不會跑。它是否正確?

謝謝!

p.s.我意識到註冊事件處理程序的第一個「長」方法也有範圍限制,但我對此有點朦朧。然而,我的主要問題是代表註冊是否會在上述方法之外生存。

回答

1

一旦你訂閱委託這種方式(你可以,如果你的地方緩存委託變量退訂使用-=運營商),你不能從用戶列表中刪除它,它直到出版商還活着會調用每一個事件上升的時刻。此外,此訂閱從垃圾收集阻止任何訂戶類(包含您訂閱的事件的方法的類)直到發佈者處於活動狀態(除非您使用靜態方法)。

爲了清晰起見,IL代碼中沒有「匿名」方法。所有代表和lamdbas都被轉換爲靜態/實例方法和閉包類(取決於它們是否使用實例成員/函數參數)。

1

如果您保留對其的引用,則可以取消訂閱委託。

EventHandler<ReadingWritingEntityEventArgs> aDelegate = delegate(object sender, ReadingWritingEntityEventArgs e) 
    { 

    }; 
_serviceContext.ReadingEntity += aDelegate; 
_serviceContext.ReadingEntity -= aDelegate; 

如果您不這樣做,則無法取消訂閱。範圍不限於它被註冊的方法。它將在活動的一生中進行註冊。

+0

謝謝扎伊德。你粘貼的代碼很近,但沒有編譯 - 我必須使用EventHandler 而不是Action。 –

+1

@AndrewBSchultz相應編輯.. –