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

时间:2013-09-04 21:30:32

标签: c# winforms events timer event-handling

我不确定这是不是一个好主意,而这可能最终会成为更多的学术活动,所以请耐心等待:

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

重新基础:

我将此Timer作为此控件的成员变量,并具有如下代码:

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的公共属性设置为一些已用的时间,只需将此控件放在我的Form上,我就会有一个很好的小控件更新自己。整齐。

这让我很好奇:

表格我要打开它已经有一个计时器。那么为什么有两个竞争计时器呢?我希望有一种方法可以让MyUserControl只在需要时使用它的内部计时器(例如,将它放在另一个没有Timer的Form上)。

我想我可以在这里公开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中的事件处理程序方法是否已连接到Form Timer的tick事件?或者使用其他类型的方法而不是我的建议?

谢谢! (道歉,如果这最终成了重复,我的google-fu今天可能会很糟糕)

1 个答案:

答案 0 :(得分:1)

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

//add a handler
timer.Tick += timer_tick;

//...

//check if timer_tick is wired to Tick
if (timer.Tick.GetInvocationList().Contains (timer_tick))
{
    //do something
}

我没有测试过,但这就是我要尝试的。