2015-06-03 248 views
0

可以說我有一個類中有一個靜態事件。此活動由三個或更多不同的類別訂閱。 [可以說4]事件 - 發佈和訂閱

現在,當有什麼值得注意的事情發生在課堂上的事件得到提升。

由於4個不同的類訂閱事件,它們中的相應處理程序執行它們各自的代碼。

現在,如果我不想讓我的班級的處理程序代碼執行3 & 4。我需要做什麼?

請幫忙。 在此先感謝!

+2

如果您不希望這些處理程序執行,他們爲什麼訂閱?你怎麼知道哪些處理程序不執行?目前你的問題還不清楚。 –

+0

如果您公開了該活動,則可以在其他班級中重複使用該活動 – Kyra

+2

這不適用於活動模式。您最好創建訂閱者註冊代理的訂閱系統(幾乎像是一個事件),但發佈者可以逐個瀏覽訂閱者並決定致電該代理。這與多播代表有所不同,因爲您不會像事件那樣將它們組合成一個。 –

回答

0

在什麼條件下你想讓你的處理程序開火?

您可以使用以下模式,它將提供一種機制來防止處理程序基於唯一標識符進行觸發。

在這個例子中,我創建一些簡單的事件參數該事件將用來告訴處理器的唯一標識符(GUID):

public class MyEventArgs : EventArgs { public Guid Identifier { get; set; } } 

然後,創建一個簡單的類引發事件:

public class EventGenerator 
{ 
    public EventHandler<MyEventArgs> TheEvent; 

    public void RaiseEvent(Guid identifier) 
    { 
     if (TheEvent != null) 
      TheEvent(this, new MyEventArgs(){Identifier = identifier}); 
    } 
} 

最後,你可以有一個類(任意數量的這些),將所有訂閱的事件,但將只運行它時,事件參數提供不同的標識符:

public class TheClass 
{ 
    private readonly Guid _identifier; 
    private EventGenerator _eventGenerator; 

    // The constructor is given the event generator class instance 
    public TheClass(EventGenerator evGen) 
    { 
     // create a unique identifier for the class 
     _identifier = Guid.NewGuid(); 

     // subscribe to the event 
     _eventGenerator = evGen; 
     _eventGenerator.TheEvent += TheEvent; 
    } 

    private void TheEvent(object sender, MyEventArgs e) 
    { 
     // when the event fires, check the Guid and if it isn't a match, don't continue ... 
     if (e.Identifier == _identifier) return; 

     // rest of the handler goes here ... 
    } 
} 

然而,這僅僅是一個例子 - 您可能需要一些不同的東西,只需在選擇時間取消訂閱活動即可實現。這取決於我最初的問題的答案。

+0

謝謝你幫我解決這個問題。 – Deepanshu