71 lines
2.1 KiB
C#
71 lines
2.1 KiB
C#
|
|
|||
|
namespace CalendarNotepad.Extends
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 防止抖动执行任务
|
|||
|
/// </summary>
|
|||
|
public class Shaking
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 下一个要执行的任务
|
|||
|
/// </summary>
|
|||
|
protected Task? Next { get; set; }
|
|||
|
/// <summary>
|
|||
|
/// 执行计时器
|
|||
|
/// </summary>
|
|||
|
protected System.Timers.Timer Timer { get; set; }
|
|||
|
/// <summary>
|
|||
|
/// 等待执行时间
|
|||
|
/// </summary>
|
|||
|
public int TimespanSeconds { get; set; }
|
|||
|
/// <summary>
|
|||
|
/// 使用默认方式实例化
|
|||
|
/// </summary>
|
|||
|
public Shaking() : this(5) { }
|
|||
|
/// <summary>
|
|||
|
/// 实例化,默认抖动执行间隔5秒
|
|||
|
/// </summary>
|
|||
|
/// <param name="timeSpanSeconds">抖动执行时间间隔。秒</param>
|
|||
|
public Shaking(int timeSpanSeconds) {
|
|||
|
this.TimespanSeconds = timeSpanSeconds * 1000;
|
|||
|
this.Timer = new System.Timers.Timer {
|
|||
|
Interval = this.TimespanSeconds
|
|||
|
};
|
|||
|
this.Timer.Elapsed += Timer_Tick;
|
|||
|
this.Timer.Stop();
|
|||
|
}
|
|||
|
|
|||
|
protected void Timer_Tick(object? sender,EventArgs e) {
|
|||
|
this.Timer.Stop();
|
|||
|
this.Timer.Dispose();
|
|||
|
if(this.Next == null) {
|
|||
|
return;
|
|||
|
}
|
|||
|
var n = this.Next;
|
|||
|
this.Next = null;
|
|||
|
n.Start();
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// 防抖执行任务
|
|||
|
/// </summary>
|
|||
|
/// <param name="task">要执行的任务</param>
|
|||
|
public void Run(Task task) {
|
|||
|
this.Next = task;
|
|||
|
if(this.Timer != null) {
|
|||
|
this.Timer.Stop();
|
|||
|
this.Timer.Dispose();
|
|||
|
}
|
|||
|
this.Timer = new System.Timers.Timer {
|
|||
|
Interval = this.TimespanSeconds,
|
|||
|
};
|
|||
|
this.Timer.Elapsed += Timer_Tick;
|
|||
|
this.Timer.Start();
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// 防抖执行委托
|
|||
|
/// </summary>
|
|||
|
/// <param name="action">要执行的委托</param>
|
|||
|
public void Run(Action action) => Run(new Task(action));
|
|||
|
}
|
|||
|
}
|