C# 如何正确使用定时器对象?

C# 如何正确使用定时器对象?,c#,asp.net,timer,C#,Asp.net,Timer,我在asp.net页面中有以下代码: protected void LoadFile(object sender, EventArgs e) { try { Timer myTimer = new Timer(); myTimer.Elapsed += new ElapsedEventHandler( RemoveFile ); myTimer.Interva

我在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
事件处理器60秒后激活?

您可以使用
myTimer.Stop()紧接着
定时器myTimer=new Timer()

我会使用微软的反应式扩展(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)
            });
}
现在,可观察对象就像事件一样,调用
.Subscribe
就像附加到事件。
.Subscribe
调用返回一个
IDisposable
,您可以通过调用
.Dispose()
来使用该IDisposable从可观察对象中分离。
SerialDisposable
对象是Rx提供的一个特殊的一次性类,它允许您分配新的一次性物品,并自动处理以前分配的任何一次性物品。这会在每次运行
LoadFile
时自动重置计时器


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

如果在40秒后再次启动LoadFile,RemoveFile将在20秒后启动。
-您的意思是,
RemoveFile
将在此时调用两次吗?(第一次呼叫后一分钟,第二次呼叫后20秒)?或者只调用一次?请不要编写代码
catch(Exception)
,更不要说
catch(Exception){}
。这是一种隐藏bug的糟糕做法。@Rob只会调用它once@Enigmativity让我想起了以前的好方法,即“下一步错误恢复时执行
,您是否可以不触摸文件标记并单独请求,在文件未更新60秒后运行并删除该文件?但LoadFile是asp.net事件处理程序中的asp.net。所以,如果我创建serialDisposable作为类变量,它将在每次回发调用中重新创建。@Michael,您可以将它放在会话变量中。或者在静态集合中,根据您的逻辑加载/创建
\u