2012-10-01 96 views
1

假設我有一個類說視圖模式類mvvm。然後爲這個虛擬機創建一些事件處理程序。那麼它可以被許多其他情況使用。如何檢測事件處理程序併發布它?

所以,如果我有一個myvm的實例,我想檢測是否有任何事件處理程序掛鉤,並希望釋放它的內存問題。

什麼是通過myvm完成此操作的通用方式,例如,我可能沒有myvm的源代碼?

+0

你想釋放什麼,事件處理程序或myvm? – CrazyCasta

回答

2

事件的設計使得聲明它們的類之外的代碼無法訪問底層代理。例如,根據一節中的C# Language specification(重點煤礦)「10.8事件」:

在以下形式的運算x + = y或x - = Y,當x是一個事件和 基準取在包含聲明x的類型之外的位置,操作結果的類型爲void(因爲 與具有x的類型相反,其中 賦值後x的值)。 此規則禁止從外部代碼中間接地檢查事件的基礎代理 。

因此,找出什麼訂閱了課外活動,充其量只能是「解決辦法」。

如果你能夠訪問包含該事件類的源和你想跟蹤迷上了代表到event,實現在事件定義和manually keep track of them in a Dictionaryaddremove關鍵字。

0

如果我理解正確。 該類封裝了我使用SocketAsyncEventArgs進行說明的未知myvm類,顯然,我們沒有SocketAsyncEventArgs類的源代碼。

而且我封裝了SocketAsyncEventArgs類的Completed事件。當該事件被觸發時,_instance_Completed將被觸發,然後_myvm事件將被觸發。所以我們需要做的是訂閱/取消訂閱_myvm事件。

然後,我離開一個人們訂閱/取消訂閱_myvm事件的事件,作爲訂閱/取消訂閱,代表被存儲到列表中,因此您可以通過調用ClearEvents()方法來清除 。

希望它會有所幫助。

public class WrapperClass 
    { 
     private EventHandler<SocketAsyncEventArgs> _myEvent; 
     private SocketAsyncEventArgs _myvm; 
     private List<Delegate> delegates; 

     public WrapperClass() 
     { 
      delegates = new List<Delegate>(); 
     } 

     public void SetInstance(SocketAsyncEventArgs myvm) 
     { 
      _myvm = myvm; 
      _myvm.Completed += new EventHandler<SocketAsyncEventArgs>(_instance_Completed); 
     } 

     private void _instance_Completed(object sender, SocketAsyncEventArgs e) 
     { 
      if (_myEvent != null) 
      { 
       _myEvent(sender, e); 
      } 
     } 

     public event EventHandler<SocketAsyncEventArgs> myEvent 
     { 
      add 
      { 
       delegates.Add(value); 
       _myEvent = (EventHandler<SocketAsyncEventArgs>)Delegate.Combine(_myEvent, value); 
      } 
      remove 
      { 
       delegates.Remove(value); 
       _myEvent = (EventHandler<SocketAsyncEventArgs>)Delegate.Remove(_myEvent, value); 
      } 
     } 

     public void ClearEvents() 
     { 
      foreach (var d in delegates) 
      { 
      _myEvent = (EventHandler<SocketAsyncEventArgs>)Delegate.Remove(_myEvent, d); 
      } 
     } 
    } 
相關問題