正確的方法應該是從每個事件分離處理程序後,你不再使用它:
public class MyObjectListener
{
private readonly MyObject _object;
public class MyObjectListener(MyObject obj)
{
_object = obj;
Attach();
}
// adds event handlers
private void Attach()
{
obj.UpdateSucceeded += UpdateSuceededHandler;
obj.UpdateFailed += UpdateFailedHandler;
}
// removes event handlers
private void Detach()
{
obj.UpdateSucceeded -= UpdateSuceededHandler;
obj.UpdateFailed -= UpdateFailedHandler;
}
...
}
您需要決定的唯一事情就是在哪裏調用Detach
方法。例如,你可以把它在處理程序本身:
private void UpdateSuceededHandler(object sender, Data args)
{
Detach();
// do something when it succeeds
}
private void UpdateFailedHandler(object sender, Data args)
{
Detach();
// do something when it fails
}
或者,你可以允許MyObjectListener
用戶告訴它不再需要聽取附加對象:
public void StopListening()
{
Detach();
}
的引發事件的對象不應允許其偵聽器修改事件調用列表。每個事件偵聽器只應訂閱或取消訂閱自己的事件處理程序。
我不會推薦這種方法。事件監聽器不應該自由地取消訂閱他們一無所知的其他事件監聽器。 – Groo
@格羅 - 總的來說,我同意。但可能有時候需要有一種方法來清除所有聽衆。 – CodeNaked
我必須承認我還沒有遇到這種情況。 BCL中沒有一個類遵循你描述的模式(在我迄今爲止有機會看到的任何開源庫中)。 – Groo