/Timers/Timer.cs |
@@ -12,23 +12,21 @@ |
{ |
public class Timer : IDisposable |
{ |
private readonly Action callback; |
private readonly Task CompletedTask = Task.FromResult(false); |
private Task Delay; |
private bool Disposed; |
|
private TimeSpan dueTime; |
private TimeSpan period; |
private CancellationTokenSource tokenSource; |
|
public Timer() |
public Timer(Action callback, TimeSpan dueTime, TimeSpan period) |
{ |
} |
this.callback = callback; |
this.dueTime = dueTime; |
this.period = period; |
|
public Timer(Action callback, TimeSpan dueTime, TimeSpan period) : this() |
{ |
Callback = callback; |
DueTime = dueTime; |
Period = period; |
|
Start(); |
Run(); |
} |
|
public Timer(Action callback, int dueTime, int period) |
@@ -50,18 +48,8 @@ |
{ |
} |
|
public Action Callback { set; get; } |
|
public TimeSpan DueTime { get; set; } = TimeSpan.Zero; |
|
public TimeSpan Period { get; set; } = TimeSpan.Zero; |
|
public void Dispose() |
{ |
// Stop the timer. |
Stop(); |
|
// Dispose the token. |
if (tokenSource != null) |
{ |
tokenSource.Cancel(); |
@@ -68,18 +56,12 @@ |
tokenSource.Dispose(); |
tokenSource = null; |
} |
|
// Set the disposed flag. |
Disposed = true; |
} |
|
private void Start() |
private void Run() |
{ |
// Check if we have an installed callback and that there is at least a due time. |
if (Callback == null || DueTime.Equals(TimeSpan.Zero)) |
return; |
|
// Dispose the previous token source. |
// Cancel any previous timer. |
if (tokenSource != null) |
{ |
tokenSource.Cancel(); |
@@ -91,22 +73,21 @@ |
tokenSource = new CancellationTokenSource(); |
|
Action tick = null; |
|
tick = () => |
{ |
Task.Run(Callback, tokenSource.Token); |
Task.Run(() => callback(), tokenSource.Token); |
if (Disposed) |
return; |
Delay = !Period.Equals(TimeSpan.Zero) ? Task.Delay(Period, tokenSource.Token) : CompletedTask; |
if (Disposed || Delay.IsCompleted) |
Delay = !period.Equals(0) ? Task.Delay(period, tokenSource.Token) : CompletedTask; |
if (Delay.IsCompleted) |
return; |
Delay.ContinueWith(o => tick(), tokenSource.Token); |
Delay.ContinueWith(t => tick(), tokenSource.Token); |
}; |
|
Delay = !DueTime.Equals(TimeSpan.Zero) ? Task.Delay(DueTime, tokenSource.Token) : CompletedTask; |
if (Disposed || Delay.IsCompleted) |
Delay = !dueTime.Equals(0) ? Task.Delay(dueTime, tokenSource.Token) : CompletedTask; |
if (Delay.IsCompleted) |
return; |
Delay.ContinueWith(o => tick(), tokenSource.Token); |
Delay.ContinueWith(t => tick(), tokenSource.Token); |
} |
|
public void Change(int dueTime, int period) |
@@ -121,10 +102,10 @@ |
|
public void Change(TimeSpan dueTime, TimeSpan period) |
{ |
DueTime = dueTime; |
Period = period; |
this.dueTime = dueTime; |
this.period = period; |
|
Start(); |
Run(); |
} |
|
public void Stop() |