Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.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_System - Fatal编程技术网

系统定时器c#

系统定时器c#,c#,timer,system,C#,Timer,System,我有一些代码涉及一个系统计时器,当一个文件被添加到一个文件夹时,它开始以秒为单位计数,然后当它被删除时停止。当计时器停止时,显示的是正确的时间。但是,当我重新启动计时器时,它会从停止的位置开始,而不是在0处重新启动。这是我的密码 t2 = new System.Timers.Timer(); t2.AutoReset = true; t2.Interval = 1000; t2.Elapsed += OnTimeEvent2;

我有一些代码涉及一个系统计时器,当一个文件被添加到一个文件夹时,它开始以秒为单位计数,然后当它被删除时停止。当计时器停止时,显示的是正确的时间。但是,当我重新启动计时器时,它会从停止的位置开始,而不是在0处重新启动。这是我的密码

        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();
}