系统定时器c#
我有一些代码涉及一个系统计时器,当一个文件被添加到一个文件夹时,它开始以秒为单位计数,然后当它被删除时停止。当计时器停止时,显示的是正确的时间。但是,当我重新启动计时器时,它会从停止的位置开始,而不是在0处重新启动。这是我的密码系统定时器c#,c#,timer,system,C#,Timer,System,我有一些代码涉及一个系统计时器,当一个文件被添加到一个文件夹时,它开始以秒为单位计数,然后当它被删除时停止。当计时器停止时,显示的是正确的时间。但是,当我重新启动计时器时,它会从停止的位置开始,而不是在0处重新启动。这是我的密码 t2 = new System.Timers.Timer(); t2.AutoReset = true; t2.Interval = 1000; t2.Elapsed += OnTimeEvent2;
t2 = new System.Timers.Timer();
t2.AutoReset = true;
t2.Interval = 1000;
t2.Elapsed += OnTimeEvent2;
watch();
}
private void OnTimeEvent2(object sender, System.Timers.ElapsedEventArgs e)
{
Invoke(new Action(() =>
{
s += 1;
lblSeconds.Text = string.Format(s.ToString());
}));
}
您可能需要执行其他操作以阻止许多计时器运行: 创建文件时,在某处注册日期时间,并在文件上添加日期 …然后在watchers deleted事件上再次获取日期时间并进行比较 事实上,如果您只是监视文件夹中某个特定文件的外观和消失,filesystemwatcher可以帮助您检测这两个事件
否则,请记住在检测到文件删除时手动恢复计数器。我建议改用
Dispatchermer
。这样,您就不需要在GUI线程上手动调用。此外,它将在停止/启动
时重置使用System.Windows.Forms.Timer,这样您就不必担心交叉线程问题。下面是一个使用Stopwatch类的快速示例:
private System.Windows.Forms.Timer tmr = new Timer();
private System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
private void Form1_Load(object sender, EventArgs e)
{
tmr.Interval = 1000;
tmr.Tick += Tmr_Tick;
tmr.Start();
sw.Start();
}
private void Tmr_Tick(object sender, EventArgs e)
{
lblSeconds.Text = ((int)sw.Elapsed.TotalSeconds).ToString();
}
要使计时器再次从零开始,只需使用Restart()方法:
您是否希望
s
返回到0?如果是这样,则需要在停止(或启动)计时器时实际将s
设置为0。是吗?这种方法,增加一个计数器,在更长的时间内是非常不准确的。改为使用类,只需在计时器事件中用经过的时间更新标签。我对计时器是新手,不确定如何实现stopwatch类。你能给我一个例子吗?是的,想法是将s设回零这看起来像winforms的问题,它不是关于重新启动计时器,而是关于重置计时器在标签中显示的值。是的,这就是我试图做的,当计时器停止时,我有一种方法获取标签的值,然后将其重置为零,然后在新文件到达文件夹时重新启动。我使用工具箱中的计时器,但它将开始快速计数,而不是保持正常的速度。
private void button1_Click(object sender, EventArgs e)
{
sw.Restart();
}