【发布时间】: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