【发布时间】:2011-01-13 19:47:28
【问题描述】:
假设我有一个配置为 10 秒(10k ms)间隔的 Windows 窗体计时器:
myTimer.Interval = 10000;
我想立即启动它并触发Tick 事件:
myTimer.Start();
myTimer_Tick(null, null);
最后一行有效,但有更好或更合适的方法吗?
【问题讨论】:
假设我有一个配置为 10 秒(10k ms)间隔的 Windows 窗体计时器:
myTimer.Interval = 10000;
我想立即启动它并触发Tick 事件:
myTimer.Start();
myTimer_Tick(null, null);
最后一行有效,但有更好或更合适的方法吗?
【问题讨论】:
我唯一要做的不同是将实际的 Tick 功能移动到一个单独的方法中,这样您就不必直接调用事件。
myTimer.Start();
ProcessTick();
private void MyTimer_Tick(...)
{
ProcessTick();
}
private void ProcessTick()
{
...
}
首先,我会这样做,因为在我看来,事件的直接调用似乎是 Code Smell - 通常它表示意大利面条结构代码。
【讨论】:
.NET 中至少有 4 个不同的“计时器”。使用 System.Threading,您可以获得一个专门允许您设置初始延迟的工具。
var Timer = new Timer(Timer_Elapsed, null, 0, 10000);
使用不同的计时器有很多好处,here 是一篇讨论它们的好文章。
【讨论】:
您可以将间隔设置为 1(0 可能意味着无限超时)并在第一次滴答时将其设置为 10k。
计时器将“很快”滴答作响(取决于您使用的计时器类型,请参阅this),但不会像您的解决方案中那样使用点击处理程序继续执行。
(我想你知道 Bevan 的解决方案)。
【讨论】:
使用两个计时器。
第一个具有您要使用的正常间隔,并且只启用第二个计时器。
第二个定时器的间隔为 100 毫秒,通常被禁用。它会运行您的代码,然后自行禁用。
要手动触发,只需启用第二个计时器。
这还允许您使用完全限定命名从另一个表单触发代码到第二个计时器。我在从一种形式调用另一种形式时使用它。
【讨论】: