2016-07-05 102 views
-1

我開發一個應用程序MEF InvocationList。我使用插件作爲發佈者,另一個作爲訂閱者。對於目前的問題,我保證這兩個插件實例都處於活動狀態。在用戶我訂閱事件,並在發佈我遍歷調用列表,並調用BeginInvoke的異步引發事件像這樣:事件處理程序沒有被調用,儘管含訂閱方法C#

出版商:

public class BackchannelEventArgs : EventArgs { 
    public string Intensity { get; } 
    public BackchannelEventArgs(string intensity) { 
     this.Intensity = intensity; 
    } 
} 

public class Publisher { 
    public event EventHandler<BackchannelEventArgs> BackchannelEvent = delegate { }; 

    private void BackchannelEventAux(string bcintensity) { 
     Plugin.LogDebug("BACKCHANNEL EVENT, sending to " + BackchannelEvent.GetInvocationList().Length + " subscribers: " + bcintensity); 

     var args = new BackchannelEventArgs(bcintensity); 
     foreach (EventHandler<BackchannelEventArgs> receiver in BackchannelEvent.GetInvocationList()) { 
      receiver.BeginInvoke(this, args, null, null); 
     } 
    } 
} 

用戶(相關片段中,初始化是由一個名爲pluginsManager中,我可以看到日誌):

class Subscriber { 

    public void Init(){ 
     LogInfo("Before subscribing"); 
     publisher.BackchannelEvent += HandleBackchannelEvent; 
     LogInfo("After subscribing"); 
    } 

    private void HandleBackchannelEvent(object sender, BackchannelEventArgs e) { 
     LogDebug("Handle Backchannel!"); 
    } 
} 

現在,您對事件處理程序查看日誌完全不叫。我有4個其他事件遵循相同的結構,特別是這個事件沒有被調用(我可以看到其他事件的日誌)。其他插件遵循完全相同的結構。

已經嘗試過:

  • 調用同步BackchannelEvent(this, args)但結果是相同的;
  • 訂閱的其他插件此相同的事件還有,但問題仍然對這個單一事件(而不是誰遵循相同的結構等)。

我希望你能給我一些這方面的幫助。

謝謝

編輯:顯示的代碼是一個片段。 Init方法正在被pluginsManager調用。我在訂閱電話前已經記錄了日誌,我可以確認我確實在訂閱。

EDIT2:在InvocationList元件的數量實際上是2(空委託和用戶),所以它檢查出來。

+0

'Init'不是構造函數,所以它不是*保證*被稱爲(儘管你的說法,它不是由代碼證明),檢查它被稱爲什麼(設置斷點出現或添加'LogDebug (「某物」)進入)。 – Sinatr

+0

我明白了。我所展示的是一小段代碼。我有一個負責調用Init()的pluginsManager。我會將其添加到帖子中。我在控制檯上顯示的init中有一個日誌。 –

+0

此外,invocationList包含2個元素:預期的空委託和訂戶。我已經把一個斷點,我可以確認正在調用BeginInvoke。 –

回答

0

好。我不知道爲什麼,但我找到了解決方案,以便其他遇到問題的人可以找到解決方案。它與我爲Random類創建的擴展相關(儘管它沒有拋出異常......所以它可能是C#上的一個錯誤,我無法真正解釋)。隨機擴展由我創建的外部NuGet包提供。

版A(不使用隨機擴展):

的事件處理程序的主體:

LogDebug("Inside Handler"); 
double intensityValue2 = GetRandomNumber(Settings.MinimumIntensity, Settings.MaximumIntensity); 
double frequency2 = GetRandomNumber(Settings.MinimumFrequency, Settings.MaximumFrequency); 
int repetitions2 = GetRandomInt(Settings.MinimuMRepetitions, Settings.MaximumRepetitions); 

版B(使用隨機擴展):

事件處理程序的主體:

LogDebug("Inside Handler"); 
double intensityValue2 = random.GetRandomNumber(Settings.MinimumIntensity, Settings.MaximumIntensity); 
double frequency2 = random.GetRandomNumber(Settings.MinimumFrequency, Settings.MaximumFrequency); 
int repetitions2 = random.GetRandomNumber(Settings.MinimuMRepetitions, Settings.MaximumRepetitions); 

版本A是它正在工作的版本。日誌保證出現。我不知道爲什麼它不讓我使用擴展,但現在解決了。它將使意義,如果隨機擴展拋出一個異常,但事實並非如此......

如果任何其他人絆倒我希望這可以幫助你找出問題比我快的問題

謝謝

相關問題