首页 文章

WeakEventManager - 未调用事件处理程序

提问于
浏览
0

我无法重现这个问题(而且项目太大了,不能在这里发布,加上我不确定哪些相关部分要发布)我想知道这里可能出现什么问题 .

我有静态事件的抽象类

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线程中运行 .

我设置了断点:

  • AddHandler() 上,它会运行,然后类的实例会持续存在 .

  • Invoke() 上,它在 OnTest 被调用时运行,我可以看到2个订阅者,如果我调用 Test.GetInvocationList() 其中一个是来自 WeakEventManagerDeliverEvent() ,所以事件已注册且 Invoke() 应该调用弱事件处理程序 .

  • 在正常的事件处理程序中,它运行 .

  • 在弱事件处理程序 nothing 内,此断点永远不会被击中 .

有关为什么会发生这种情况或我应该调查什么的任何想法?


我试着去研究.net sources,在那里找到答案,但有 ProtectedAddHandler 哪些来源我找不到......我找到it,但下一步是什么?抽象方法,谁实现它?...

1 回答

  • 0

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

    对于遇到此问题的人来说,问题是: you must rise static event with null as sender !例如 . 在我的情况下它是(用这个来重现问题中代码的问题):

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

    这个案例将由 normal 订阅者处理,没有任何问题 .

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


相关问题