我在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秒后被激活?
答案 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的一个用途 - 它有更多的用途,非常强大,值得学习。