我開發一個應用程序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(空委託和用戶),所以它檢查出來。
'Init'不是構造函數,所以它不是*保證*被稱爲(儘管你的說法,它不是由代碼證明),檢查它被稱爲什麼(設置斷點出現或添加'LogDebug (「某物」)進入)。 – Sinatr
我明白了。我所展示的是一小段代碼。我有一個負責調用Init()的pluginsManager。我會將其添加到帖子中。我在控制檯上顯示的init中有一個日誌。 –
此外,invocationList包含2個元素:預期的空委託和訂戶。我已經把一個斷點,我可以確認正在調用BeginInvoke。 –