Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中重置计时器?_C#_Timer - Fatal编程技术网

如何在C#中重置计时器?

如何在C#中重置计时器?,c#,timer,C#,Timer,我知道有三个Timer类,System.Threading.Timer,System.Timers.Timer,和System.Windows.Forms.Timer,但它们都没有将当前运行时间重置为0的.Reset()函数 是否有具有此功能的BCL类?有没有一种非黑客的方法?(我想改变它的时间限制可能会重置它)想想重新实现一个具有此功能的计时器类有多困难,或者如何使用其中一个BCL类可靠地完成它?我总是这样做 myTimer.Stop(); myTimer.Start(); 。。。那是黑客吗

我知道有三个
Timer
类,
System.Threading.Timer
System.Timers.Timer
,和
System.Windows.Forms.Timer
,但它们都没有将当前运行时间重置为0的
.Reset()
函数

是否有具有此功能的BCL类?有没有一种非黑客的方法?(我想改变它的时间限制可能会重置它)想想重新实现一个具有此功能的
计时器类有多困难,或者如何使用其中一个BCL类可靠地完成它?

我总是这样做

myTimer.Stop();
myTimer.Start();
。。。那是黑客吗?:)

根据评论,关于Threading.Timer,它是

dueTime类型:
System.Int32
启动前的延迟时间量 调用指定的回调方法 构建计时器时,在 毫秒。具体说明
超时。无限
以防止 从重新启动计时器。指定零 (0)立即重新启动计时器


除System.Threading.Timer外,所有计时器都具有等效的Start()和Stop()方法

因此,一种扩展方法,如

public static void Reset(this Timer timer)
{
  timer.Stop();
  timer.Start();
}

…是一种方法。

您可以编写一个名为Reset()的扩展方法

  • 为Timer.Timer和Forms.Timer调用Stop()-Start()
  • 调用线程的更改。计时器

重置windows.timer的其他替代方法是使用计数器,如下所示:

int timerCtr = 0;
Timer mTimer;

private void ResetTimer() => timerCtr = 0;
private void mTimer_Tick()
{
    timerCtr++;
    // Perform task
}  
因此,如果您打算每1秒重复一次,可以将计时器间隔设置为100ms,并将计数器测试为10个周期

如果计时器应等待某些进程,这些进程可能在不同的时间跨度结束,则此选项适用。

对于计时器(System.Windows.Forms.timer)


.Stop,然后.Start方法用作重置。

根据MSDN文档,对于
系统.Timers.Timer

如果在计时器启动后设置间隔,则计数为 重置。例如,如果将间隔设置为5秒,然后设置 如果Enabled属性为true,则计数从启用时开始 设置如果在计数为3秒时将间隔重置为10秒, 经过的事件在13秒后首次引发 Enabled设置为true

所以


我刚刚给计时器分配了一个新值:

mytimer.Change(10000,0);//重置为10秒

这对我来说很好

在代码顶部定义计时器:
System.Threading.timer myTimer

if (!active)
    myTimer = new Timer(new TimerCallback(TimerProc));

myTimer.Change(10000, 0);
active = true;

private void TimerProc(object state)
{
    // The state object is the Timer object.
    var t = (Timer)state;

    t.Dispose();
    Console.WriteLine("The timer callback executes.");
    active = false;
    
    // Action to do when timer is back to zero
}
我这样做

//Restart the timer
queueTimer.Enabled = true;

在使用
系统时,您可以执行
timer.Interval=timer.Interval
以明确说明,因为其他一些注释是不正确的。Timers
设置为true将重置经过的时间。我刚刚用以下方法测试了该行为:

Timer countDown= new Timer(3000);

Main()
{
    TextBox.TextDidChange += TextBox_TextDidChange;
    countdown.Elapsed += CountDown_Elapsed;
}

void TextBox_TextDidChange(Object sender, EventArgs e)
{
    countdown.Enabled = true;
}

void CountDown_Elapsed(object sender, EventArgs e)
{
    System.Console.WriteLine("Elapsed");
}
我会反复地在文本框中输入文本,而计时器在最后一次击键后只会运行3秒钟。文档中也暗示了这一点,您将看到:调用
Timers.Start()
只是将Enabled设置为true


当然,我从一开始就应该直接讨论这个问题,您将在中看到,如果启用一个已经启用的计时器,它将调用private
UpdateTimer()
方法,该方法在内部调用
Change()

使用JP的解决方案使用扩展方法我也有同样的重置需求,出于上述相同的原因,FileSystemWatcher令人不快且不方便使用如果您使用秒表作为计时器并使用扩展方法答案,请小心,因为Stopwatch.Restart扩展方法将出现在.NET 4.0中。另一个问题是,只有woeks使用Forms.Timer,而我的应用程序没有GUI(Application.Start(),没有参数),因此我认为Threading.Timer类更好,因为还有其他原因,但有一点很好。@Matthew:有关各种计时器类的讨论以及何时使用它们是合适的,请参阅。但是,一般来说,
Forms.Timer
应该只与GUI一起使用。然而,除了
Forms.Timer
Threading.Timer
之外,还有
Timer.Timer
。我不想测量经过的时间。我的确切用例是,我有一个文件系统观察者监视一个目录,并希望捕获一组更改(例如,在彼此相隔5秒的范围内进行的更改)。理论上,第一次更改会启动一个计时器,每次更改都会重置计时器,直到它最终触发并关闭组。是的,当我重新阅读你的问题时,我发现了这一点。编辑了我的答案。这是有效的,需要注意的是,如果只调用
timer.Start()
,这将不起作用。我做了个测试。尝试删除
计时器。停止其中的
,您将看到差异。这里的问题是,您并不总是知道您希望重置计时器是否已在运行。因此,您必须执行aTimer.Interval=TIMEOUT和aTimer.Start()。因此,总的来说,上面的重置函数使用的行和变量更少。不过添加得很好。@R-U-Bn OP清楚地说明了“一个.Reset()函数,它将把当前经过的时间重置为0。”——它没有提到它是用于一个设计糟糕的应用程序,在这个应用程序中,你甚至不知道计时器是否正在运行。还可以查看作者的评论(4年多以前):“理论上,第一次更改会启动一个计时器,每次更改都会重置计时器,直到它最终触发并关闭组。”。无论如何,谢谢你的否决票。我也看到了这样的问题。我所做的是:aTimer.Interval=aTimer.Interval。这触发了循环的发生。我不明白为什么,但它是有效的…这只是使它。即使它事先被禁用,重新启用也不会改变收集到该点的已用时间。不,你错了。当且仅当
Enabled
的当前值不等于新的
值时,才会调用private
updatetimer
方法。我甚至不知道
Timer countDown= new Timer(3000);

Main()
{
    TextBox.TextDidChange += TextBox_TextDidChange;
    countdown.Elapsed += CountDown_Elapsed;
}

void TextBox_TextDidChange(Object sender, EventArgs e)
{
    countdown.Enabled = true;
}

void CountDown_Elapsed(object sender, EventArgs e)
{
    System.Console.WriteLine("Elapsed");
}