确定事件处理程序方法是否连接到事件

本文关键字:连接 事件 是否 方法 事件处理 程序 | 更新日期: 2023-09-27 18:30:15

>我不确定这是否是一个好主意,这可能最终会更像是一个学术练习,所以请耐心等待:

假设我正在制作一个用户控件(就像我一样),它将每隔 X 秒(使用计时器)查找一个文本文件并在此用户控件中显示该信息。 我们称此控件为 MyUserControl。

要重新讨论基本内容:

我会将此计时器作为此控件的成员变量,并具有如下所示的代码:

this.timer1.Tick += new System.EventHandler(this.timer1_Tick);

以及如下所示的事件处理程序方法:

private void timer1_Tick(object sender, EventArgs e)
{
    // Read text-file and do lots of goodness.
}

很酷,所以现在我可以将 MyUserControl 的公共属性设置为经过的时间,只需在我的窗体上放置这个控件,我就有了一个很好的小控件更新自己。 整洁。

以下是让我好奇的事情:

我要扑通一声的表格已经有一个计时器。 那么为什么有两个相互竞争的计时器呢? 我希望 MyUserControl 有一种方法可以在需要时使用它的内部计时器(例如,将其放在另一个还没有计时器的表单上)。

我想我可以像这样公开我的用户控件timer1_Tick:

public void timer1_Tick(object sender, EventArgs e)
{
    // Read text-file and do lots of goodness.
}

然后,因为这些东西是多播的,所以在这里以这样的形式做一些事情:

this.theFormTimer.Tick += new System.EventHandler(this.theFormTimer_Tick);
this.theFormTimer.Tick += new System.EventHandler(MyUserControlObject.timer1_Tick);

并且还将 MyUserControl 的成员变量设置为不启用自身。

但是有没有更光滑的方法呢? 我能否以某种方式确定 MyUserControl 中的事件处理程序方法已连接到表单计时器的 tick 事件? 或者使用我建议以外的其他类型的方法?

谢谢! (抱歉,如果这最终是重复的,我的谷歌福今天可能很糟糕)

确定事件处理程序方法是否连接到事件

不讨论你是否应该这样做,但要回答这个问题,我会这样做:

//add a handler
timer.Tick += timer_tick;
//...
//check if timer_tick is wired to Tick
if (timer.Tick.GetInvocationList().Contains (timer_tick))
{
    //do something
}

我还没有测试过它,但这就是我会尝试的。