wasSharp

Subversion Repositories:
Compare Path: Rev
With Path: Rev
?path1? @ 21  →  ?path2? @ 20
/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()