C# 如何正确使用定时器对象?
我在asp.net页面中有以下代码: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
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
。