【问题标题】:WeakEventManager - event handler is not calledWeakEventManager - 不调用事件处理程序
【发布时间】:2017-05-31 10:18:28
【问题描述】:

我无法重现该问题(并且项目太大,无法在此处发布,而且我不确定要发布哪些相关部分),我需要了解可能出错的地方在这里。

我有带有静态事件的抽象类

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 个订阅者其中一个是来自WeakEventManagerDeliverEvent(),所以事件已注册并且Invoke() 应该调用弱事件处理程序。
  3. 在正常的事件处理程序中,它运行。
  4. 在弱事件处理程序中,nothing,这个断点永远不会被命中。

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


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

【问题讨论】:

  • 你说的是什么抽象方法? ProtectedAddHandler 和 AddHandler 都不是抽象的
  • 为了调试这个问题,我会在订阅者类中添加一个终结器,它会输出一条调试消息来通知它何时完成。

标签: c# event-handling weak-events weakeventmanager


【解决方案1】:

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

对于遇到这个问题的人来说,问题是:您必须将static 事件与null 设为sender!例如。就我而言,它是(使用它来重现问题中的代码问题):

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

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

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


【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 2021-06-27
    相关资源
    最近更新 更多