我无法重现这个问题(而且项目太大了,不能在这里发布,加上我不确定哪些相关部分要发布)我想知道这里可能出现什么问题 .
我有静态事件的抽象类
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()
其中一个是来自WeakEventManager
的DeliverEvent()
,所以事件已注册且Invoke()
应该调用弱事件处理程序 . -
在正常的事件处理程序中,它运行 .
-
在弱事件处理程序 nothing 内,此断点永远不会被击中 .
有关为什么会发生这种情况或我应该调查什么的任何想法?
我试着去研究.net sources,在那里找到答案,但有 ProtectedAddHandler
哪些来源我找不到......我找到it,但下一步是什么?抽象方法,谁实现它?...
1 回答
对于遇到此问题的人来说,问题是: you must rise static event with null as sender !例如 . 在我的情况下它是(用这个来重现问题中代码的问题):
这个案例将由 normal 订阅者处理,没有任何问题 .
但是在
WeakEventManager
的情况下,它必须是null
(特殊情况),否则您的事件处理程序将无法工作 .