【问题标题】:Determine if an Event Handler Method is wired to an Event?确定事件处理程序方法是否连接到事件?
【发布时间】:2013-09-04 21:30:32
【问题描述】:

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

假设我正在制作一个 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 的公共属性设置为某个经过的时间,并且只需将这个控件放在我的表单上,我就有一个不错的小控件更新自身。整洁。

让我好奇的是:

我要放置它的表单已经有一个计时器。那么为什么有两个相互竞争的计时器呢?我希望有一种方法让 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 中的事件处理程序方法已连接到 Form Timer 的滴答事件?或者使用我建议的其他类型的方法?

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

【问题讨论】:

  • 这样做没有意义。
  • 你不关心这两个计时器吗?我不确定我是否应该这样做。
  • 首先,您可能不应该担心它。计时器是一个非常轻量级的组件。其次,如果另一个定时器的周期是 1 秒呢?或 1 小时。并且您的组件希望每分钟更新一次?
  • 是的,如果我希望它们具有相同的经过时间,我只会使用表单的计时器。一个警告:虽然这被归类为“WinForms”,但我实际上使用的是 Visual WebGUI。所以,我认为,一旦我编译并运行,Timer 实际上就相当于 javascript 的 SetInterval。不确定这是否会影响它是否“轻量级”。无论如何,看起来人们并不关心。我只是想仔细检查一下。
  • 当然,如果有人想作为学术练习来回答,或者有人想回答以便我可以绿色复选标记,我也很乐意!

标签: c# winforms events timer event-handling


【解决方案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
}

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

【讨论】:

  • 仅供参考,我不这样做。此外,我什至以“我不确定这是个好主意”作为这个问题的开头。最后,对我来说,这更像是一个学术练习,看看有什么可能。无论如何......只是为了哈哈,我会试试你的建议。
  • 仅供参考,事件“System.Windows.Forms.Timer.Tick”只能出现在 += 或 -= 的左侧。我给了它大约 10 分钟的时间来尝试解决这个问题,然后开始编写生产代码!
  • 感谢您的尝试。我也试过了,你实际上可以从定义事件的类中调用 GetActivationList()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
相关资源
最近更新 更多