如何正确使用Timer对象?

时间:2016-03-06 22:41:51

标签: c# asp.net timer

我在asp.net页面中有这个代码:

    protected void LoadFile(object sender, EventArgs e)
    {
        try
        {
               Timer myTimer = new Timer();
               myTimer.Elapsed += new ElapsedEventHandler( RemoveFile );
               myTimer.Interval = 60000;
               myTimer.Start();
        }
        catch (Exception)
        {
        }
    }

    private void RemoveFile(object source, ElapsedEventArgs e)
    {
            string path = UniquePath();
            File.Delete(path);
    }

当LoadFile事件处理程序在60秒后触发RemoveFile函数(在此行中定义myTimer.Interval = 60000)时,如果LoadFile在40秒后再次触发,则RemoveFile将在20秒内触发。

我的问题是如何让RemoveFile函数在上次调用LoadFile事件hanlder后60秒后被激活?

2 个答案:

答案 0 :(得分:0)

可能你可以使用 在myTimer.Stop();

之后Timer myTimer = new Timer();

答案 1 :(得分:0)

我会使用Microsoft的Reactive Extensions(NuGet" Rx-Main")。代码变为:

private SerialDisposable _serialDisposable = new SerialDisposable();

protected void LoadFile(object sender, EventArgs e)
{
    _serialDisposable.Disposable =
        Observable
            .Interval(TimeSpan.FromSeconds(60.0))
            .Subscribe(n =>
            {
                string path = UniquePath();
                File.Delete(path)
            });
}

现在,observable就像事件一样,调用.Subscribe就像附加到事件一样。 .Subscribe调用返回IDisposable,您可以通过调用.Dispose()将其与观察者分离。 SerialDisposable对象是Rx提供的特殊一次性类,可让您分配新的一次性用品并自动处理以前分配的任何一次性用品。每次运行LoadFile时,这会自动重置计时器。

这只是Rx的一个用途 - 它有更多的用途,非常强大,值得学习。