2017-05-31 44 views
0

我不能重現這個問題(並且項目太大而無法在此處發佈,另外我不確定相關部分要發佈什麼),我需要什麼可能的想法這裏出錯了。WeakEventManager - 不叫事件處理程序

我有一個靜態的事件

public abstract partial class A : Base 
{ 
    public static event EventHandler Test; 
    public static void OnTest() => Test?.Invoke(null, EventArgs.Empty); 
} 

然後我訂閱了這個事件通常抽象類和使用WeakEventManager

A.Test += (s, e) => { }; 
WeakEventManager<A, EventArgs>.AddHandler(null, nameof(A.Test), (s, e) => { }); 

而對於某些原因弱事件處理程序不被解僱當調用OnTest()時。一切(調用和處理程序)都在UI線程中運行。

我已經設置斷點:

  1. AddHandler(),它運行和類的實例,然後堅持。
  2. Invoke(),當它運行時OnTest被調用時,我可以看到2個用戶,如果我打電話給他們的Test.GetInvocationList()一個是WeakEventManagerDeliverEvent(),所以事件進行了登記並Invoke()應該叫弱的事件處理程序。
  3. 在正常的事件處理程序中運行。
  4. 內部弱事件處理程序,什麼都沒有,這個斷點永遠不會被擊中。

任何想法爲什麼會發生這種情況,或者我應該調查什麼?


我試圖尋找到.NET sources,到那裏尋找答案,但有ProtectedAddHandler它的來源,我找不到...... 我發現it,但什麼是下一個? ?抽象方法,誰實現它...

+0

你在說什麼抽象方法? ProtectedAddHandler和AddHandler都不是抽象的 –

+0

爲了調試這個問題,我將添加一個終結器給訂閱者類,它將輸出一個調試消息以通知它何時完成。 –

回答

0

WeakEventManager ......不工作的事件處理程序...

誰就面臨着這個問題,這個問題是這樣的:你必須上升static事件用null作爲sender!例如。在我的情況下,它是(用這個複製的代碼中的問題的問題):

public static void OnTest() => Test?.Invoke("whatever", EventArgs.Empty); 

這種情況將正常用戶沒有任何問題來處理。

但在WeakEventManager的情況下,它必須是null(特殊情況),否則您的事件處理程序將不起作用。