[技術回顧系列]–c#中事件進階應用程式

來源:互聯網
上載者:User
都知道一般情況下事件申明格式如: public event delegate Type event Name;
但是,不是我們時刻都需要這樣申明的,因為它會適當佔用我們的記憶體空間。這時我們可以採用另一種基於索引值對的方式來操作,需要的時候在建立和調用,不需要的時候就移出。即:通過add和remove訪問器來自訂實現添加和移出事件處理常式。
下面說說實現該方案的整個流程:
1:聲明事件類型
  eg: public delegate void DemoEventHandler(object sender,yourEventArgs e);
2: 為事件產生一個唯一的鍵
 eg:  static readonly object DemoEventKey = new object();
3: 使用Hashtable 儲存事件處理常式
 eg: protected Hashtable handlers = new Hashtable();
4: 寫入事件 add / remove 訪問器
 eg:
 public void AddEventHandler(object eventKey, Delegate handler)
 {
   lock(this)
   {
     if (handlers[ eventKey ] == null)
    {
       handlers.Add( eventKey, handler );
    }
   else
   {
       handlers[ eventKey ] = handler;
    }
    }
  }
public void RemoveEventHandler(object eventKey)
 {
 lock(this)
 {
  handlers.Remove( eventKey );
 }
 }
public Delegate GetEventHandler(object eventKey)
 {
 return (Delegate) handlers[ eventKey ];
 }
5:進行事件申明
eg:
 public event DemoEventHandler Demo
 {
 add { AddEventHandler(DemoEventKey, value); }
 remove { RemoveEventHandler(DemoEventKey); }
 }
6:對事件進行封裝
eg:
 //DemoEventArgs應該是從System.EventArgs而來
 public virtual void OnDemo(DemoEventArgs e )
 {
 DemoEventHandler handler =
 (DemoEventHandler) GetEventHandler( DemoEventKey );
 if (handler != null)
 {
     handler(this, e);
 }
 }
7:使用事件
eg:
 public void DoSomething()
 {
    //此處需要看具體情況向外界發出對應的事件參數
    //通常可以採用建構函式完成。
    OnDemo(new DemoEventKey(yourParameter))
   
 }
8://串連事件進處理,和一般的事件處理常式一樣進行掛接
 略

BTW: 事實上對於上面的方案,如果該事件被掛接多次的話,後面事件處理常式會覆蓋前面的,也就是說最終只有一個事件被真正的掛接,這也就是所謂的單播事件.當然為瞭解決這個問題我們可以採用多播事件來處理,如果知道Observer模式的同志就不會陌生了.一般可以按照傳統採用非靜態成員來標識事件類型的方式,當在用戶端為一個事件預定多個事件處理函數的時候,是按照隊列的方式來處理的(即先進先出原則),比如ListDictionary是個選擇,不過當事件很多而對效能要求又很高時,需考慮其它方式實現了.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.