You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.0 KiB
C#
72 lines
2.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Timers;
|
|
using System.Windows.Forms;
|
|
|
|
namespace GeoSigma.SigmaDrawerUtil
|
|
{
|
|
public class SlowDownTimer : System.IDisposable
|
|
{
|
|
private System.Timers.Timer onceTimer;
|
|
|
|
private Action action = null;
|
|
|
|
private double interval;
|
|
|
|
public SlowDownTimer(double interval)
|
|
{
|
|
this.interval = interval;
|
|
}
|
|
|
|
public void Invoke(Control c, Action ac)
|
|
{
|
|
if (onceTimer == null)
|
|
{
|
|
onceTimer = new System.Timers.Timer(this.interval);
|
|
onceTimer.AutoReset = false; // 仅执行一次
|
|
onceTimer.Elapsed += OnceTimer_Elapsed;
|
|
}
|
|
|
|
onceTimer.Stop();
|
|
onceTimer.Start();
|
|
|
|
this.action = () => c.Invoke(new MethodInvoker(ac));
|
|
}
|
|
|
|
private void OnceTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
|
|
{
|
|
this.action?.Invoke();
|
|
}
|
|
public void Dispose()
|
|
{
|
|
Dispose(true);
|
|
|
|
System.GC.SuppressFinalize(this);
|
|
// 上面一行代码作用是防止"垃圾回收器"调用这个类中的方法
|
|
// " ~ResourceHolder() "
|
|
// 为什么要防止呢? 因为如果用户记得调用Dispose()方法,那么
|
|
// "垃圾回收器"就没有必要"多此一举"地再去释放一遍"非托管资源"了
|
|
// 如果用户不记得调用,就让"垃圾回收器"帮我们去释放。
|
|
}
|
|
protected virtual void Dispose(bool disposing)
|
|
{
|
|
if (disposing)
|
|
{
|
|
if (onceTimer != null)
|
|
{
|
|
onceTimer.Stop();
|
|
onceTimer.Dispose();
|
|
}
|
|
}
|
|
// 这里是清理"非托管资源"的用户代码段
|
|
}
|
|
~SlowDownTimer()
|
|
{
|
|
Dispose(false);
|
|
}
|
|
}
|
|
}
|