【问题标题】:.NET Eventhandler Management.NET 事件处理程序管理
【发布时间】:2009-07-01 14:45:52
【问题描述】:

我在代码中有一个事件处理程序,当我期望它只被调用一次时,我看到它被多次调用。

过去这是因为我在错误的位置定义了委托(因此更多的一个委托被添加到事件处理列表中),但在这种情况下,这只被设置一次(在类构造函数中) .

与其继续手动搜索我的代码以查找错误,我是否可以采取一种(简单)实用的方法来确定事件处理程序的分配位置?

【问题讨论】:

    标签: c# event-handling


    【解决方案1】:

    你可以替换默认的:

    public event EventHandler MyEvent;
    

    ...与

    private EventHandler _myEvent;
    
    public event EventHandler MyEvent
    {
        add { _myEvent += value; }
        remove { _myEvent -= value; }
    }
    

    然后您可以在添加/删除函数中放置日志记录或断点并查看调用堆栈。

    【讨论】:

    • 这是一个非常简单和简洁的解决方案 - 就像一个魅力。谢谢。
    【解决方案2】:

    如果您使用的是 vb.net,那么您确定您没有在方法中添加处理程序并且还使用了 handles 关键字?

    这会导致一个事件被处理两次。

    【讨论】:

    • 好主意,但这同样侧重于手动搜索。我也在使用 C#。无论如何,谢谢。
    【解决方案3】:

    安装Resharper,然后右键单击您的活动并选择“查找用法”。

    【讨论】:

    • 很想,但我没有许可证或预算 :-(
    • 我会说它在大约 1 个月内收回成本。我再也不会接受没有(或类似的)工作。
    【解决方案4】:

    我有一个代码。它的 2 个类用于帮助访问事件

    Event Classes

    并在我的代码中介绍这个:

    alt text http://img440.imageshack.us/img440/1656/featurer.jpg

    现在可以调试进入的事件

    CSoft.Core.EventHelper.Raise();
    

    【讨论】:

    • 很好的建议,但罗杰斯关于定制访问器的想法真的很简单,而且很有魅力。无论如何,感谢您的输入。标记
    【解决方案5】:

    您可以更改名称(不使用 Visual Studio 重构工具,只需在代码中更改名称)并查看编译器中断的位置。

    【讨论】:

      猜你喜欢
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多