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

我设置了断点:

  1. 在 上AddHandler(),它运行,然后类的实例持续存在。
  2. On Invoke(),它在OnTest被调用时运行,如果我调用Test.GetInvocationList()其中一个是DeliverEvent()from ,我可以看到 2 个订阅者WeakEventManager,因此事件已注册并且Invoke()应该调用弱事件处理程序。
  3. 在普通事件处理程序中,它运行。
  4. 在弱事件处理程序中,什么都没有,这个断点永远不会被击中。

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


我试图查看 .net资源,在那里找到答案,但有些ProtectedAddHandler资源我找不到……我找到,但接下来是什么?抽象方法,谁来实现?...

4

1 回答 1

0

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

对于面对这个问题的人来说,问题是:你必须使用as来提升static事件nullsender!例如,在我的情况下是(使用它来重现问题中的代码问题):

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

这种情况将由普通订户处理,没有任何问题。

但是如果WeakEventManager它必须是一个null(特殊情况),否则你的事件处理程序将无法工作。


于 2017-05-31T13:58:57.293 回答