WeakEventManager - 未调用事件处理程序

时间:2017-05-31 10:18:29

标签: c# event-handling weak-events 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被调用时运行,如果我拨打Test.GetInvocationList()我可以看到2个订阅者,其中一个是来自DeliverEvent()的{​​{1}},所以事件已注册,WeakEventManager应调用弱事件处理程序。
  3. 在正常的事件处理程序中,它运行。
  4. 在弱事件处理程序中,,此断点永远不会被击中。
  5. 有关为什么会发生这种情况或我应该调查什么的任何想法?

    我试图查看.net sources,在那里找到答案,但有Invoke()哪些来源我找不到... 我发现了it,但下一步是什么?抽象方法,谁实现它?...

1 个答案:

答案 0 :(得分:0)

  

WeakEventManager ...没有工作的事件处理程序......

对于遇到此问题的任何人,问题是:您必须使用static作为null 举起sender个活动!例如。在我的情况下它是(用这个来重现问题中代码的问题):

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

此案例将由普通订阅者处理,没有任何问题。

但是在WeakEventManager的情况下,它必须是null(特殊情况),否则您的事件处理程序将无效。