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)
这可能还是更复杂?
您必须使用反射来获取事件委托的调用列表:
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)
如果您只关心在调试器下执行此操作,而不是以编程方式执行此操作,那么这可能是一种更简单的非侵入式方法:
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 选项卡。该事件在展开时将显示调用计数和事件处理程序:
