如何在调试时轻松查看事件订阅的数量?

Mad*_*gan 5 c# events eventtrigger subscription

在调试时,我textBox1.TextChanged可以查看事件订阅的数量吗?如果是,那我该如何钻研呢?我需要知道在给定时间有多少订阅用于调试,因为它看起来像是多次触发事件,但我怀疑这个错误确实textBox1.TextChanged += handler是因为在应用程序中管理不当,所以订阅者太多了.

这是我认为正在发生的事情的简化版本.如果可能的话,我只想设置一个断点并计算"textBox1.TextChanged"的订阅数量:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    textBox1.TextChanged += textBox1_TextChanged;
    MessageBox.Show("asdf");
    textBox1.TextChanged -= textBox1_TextChanged;        
    textBox1.Text = DateTime.Now.ToString();
    textBox1.TextChanged += textBox1_TextChanged;
}
Run Code Online (Sandbox Code Playgroud)

这可能还是更复杂?

Vol*_*lma 5

您必须使用反射来获取事件委托的调用列表:

    textBox1.TextChanged += textBox1_TextChanged;
    MessageBox.Show("asdf");
    textBox1.TextChanged -= textBox1_TextChanged;        
    textBox1.Text = DateTime.Now.ToString();
    textBox1.TextChanged += textBox1_TextChanged;
    var eventField = textBox1.GetType().GetField("TextChanged", BindingFlags.GetField
                                                               | BindingFlags.NonPublic
                                                               | BindingFlags.Instance);

    var subscriberCount = ((EventHandler)eventField.GetValue(textBox1))
                .GetInvocationList().Length;
Run Code Online (Sandbox Code Playgroud)


Cli*_*ick 5

如果您只关心在调试器下执行此操作,而不是以编程方式执行此操作,那么这可能是一种更简单的非侵入式方法:

class _24003458
{
    event EventHandler MyEvent;
    public void Test()
    {
        MyEvent += Handler1;
        MyEvent += Handler2;
        MyEvent(this, EventArgs.Empty);
    }
    void Handler1(object sender, EventArgs e)
    {
        throw new NotImplementedException();
    }
    void Handler2(object sender, EventArgs e)
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

在任一事件处理程序上放置一个断点,当它中断时,查看 Locals 选项卡。该事件在展开时将显示调用计数和事件处理程序:

程序在断点处停止的屏幕截图和本地窗口显示具有调用计数和处理程序的扩展事件