wasSharp – Diff between revs 10 and 20

Subversion Repositories:
Rev:
Show entire fileIgnore whitespace
Rev 10 Rev 20
Line 8... Line 8...
8 using System.Threading; 8 using System.Threading;
9 using System.Threading.Tasks; 9 using System.Threading.Tasks;
Line 10... Line 10...
10   10  
11 namespace wasSharp.Timers 11 namespace wasSharp.Timers
12 { -  
13 public delegate void TimerCallback(object state); -  
14   12 {
15 public class Timer : IDisposable 13 public class Timer : IDisposable
16 { -  
17 private static readonly Task CompletedTask = Task.FromResult(false); 14 {
18 private readonly TimerCallback Callback; 15 private readonly Action callback;
19 private readonly object State; 16 private readonly Task CompletedTask = Task.FromResult(false);
20 private Task Delay; 17 private Task Delay;
-   18 private bool Disposed;
21 private bool Disposed; 19 private TimeSpan dueTime;
22 private int Period; 20 private TimeSpan period;
Line 23... Line 21...
23 private CancellationTokenSource TokenSource; 21 private CancellationTokenSource tokenSource;
24   22  
25 public Timer(TimerCallback callback, object state, int dueTime, int period) 23 public Timer(Action callback, TimeSpan dueTime, TimeSpan period)
26 { 24 {
27 Callback = callback; 25 this.callback = callback;
-   26 this.dueTime = dueTime;
28 State = state; 27 this.period = period;
29 Period = period; 28  
Line 30... Line 29...
30 Reset(dueTime); 29 Run();
31 } 30 }
32   31  
33 public Timer(TimerCallback callback, object state, TimeSpan dueTime, TimeSpan period) 32 public Timer(Action callback, int dueTime, int period)
Line 34... Line 33...
34 : this(callback, state, (int) dueTime.TotalMilliseconds, (int) period.TotalMilliseconds) 33 : this(callback, TimeSpan.FromMilliseconds(dueTime), TimeSpan.FromMilliseconds(period))
35 { 34 {
36 } 35 }
Line 37... Line 36...
37   36  
-   37 public Timer(Action callback) : this(callback, TimeSpan.Zero, TimeSpan.Zero)
38 public Timer(TimerCallback callback) : this(callback, null, TimeSpan.Zero, TimeSpan.Zero) 38 {
39 { -  
40 } -  
41   39 }
Line 42... Line 40...
42 public void Dispose() 40  
-   41 public Timer(Action callback, double dueTime, int period)
43 { 42 : this(callback, TimeSpan.FromMilliseconds(dueTime), TimeSpan.FromMilliseconds(period))
44 Dispose(true); -  
45 GC.SuppressFinalize(this); 43 {
Line 46... Line 44...
46 } 44 }
47   45  
48 ~Timer() 46 public Timer(Action callback, uint dueTime, uint period)
-   47 : this(callback, TimeSpan.FromMilliseconds(dueTime), TimeSpan.FromMilliseconds(period))
49 { 48 {
-   49 }
-   50  
-   51 public void Dispose()
50 Dispose(false); 52 {
51 } 53 if (tokenSource != null)
Line 52... Line 54...
52   54 {
53 private void Dispose(bool cleanUpManagedObjects) 55 tokenSource.Cancel();
54 { 56 tokenSource.Dispose();
55 if (cleanUpManagedObjects) 57 tokenSource = null;
56 Cancel(); 58 }
57 Disposed = true; -  
58 } 59 Disposed = true;
59   -  
60 public void Change(int dueTime, int period) 60 }
61 { 61  
62 Period = period; 62 private void Run()
Line 63... Line 63...
63 Reset(dueTime); 63 {
64 } -  
65   64 // Cancel any previous timer.
66 public void Change(uint dueTime, int period) -  
Line 67... Line -...
67 { -  
68 Period = period; -  
69 Change((int) dueTime, period); -  
70 } -  
71   -  
72 public void Change(TimeSpan dueTime, TimeSpan period) -  
73 { 65 if (tokenSource != null)
74 Change((int) dueTime.TotalMilliseconds, (int) period.TotalMilliseconds); 66 {
75 } 67 tokenSource.Cancel();
76   68 tokenSource.Dispose();
77 private void Reset(int due) 69 tokenSource = null;
78 { 70 }
79 Cancel(); 71  
80 if (due <= 0) 72 // Create a new cancellation source.
81 return; 73 tokenSource = new CancellationTokenSource();
82 TokenSource = new CancellationTokenSource(); 74  
83 Action tick = null; 75 Action tick = null;
-   76 tick = () =>
84 tick = () => 77 {
85 { 78 Task.Run(() => callback(), tokenSource.Token);
86 Task.Run(() => Callback(State)); 79 if (Disposed)
87 if (Disposed) 80 return;
88 return; 81 Delay = !period.Equals(0) ? Task.Delay(period, tokenSource.Token) : CompletedTask;
Line 89... Line 82...
89 Delay = Period > 0 ? Task.Delay(Period, TokenSource.Token) : CompletedTask; 82 if (Delay.IsCompleted)
90 if (Delay.IsCompleted) 83 return;
91 return; 84 Delay.ContinueWith(t => tick(), tokenSource.Token);
92 Delay.ContinueWith(t => tick(), TokenSource.Token); 85 };
Line 93... Line 86...
93 }; 86  
94 Delay = due > 0 ? Task.Delay(due, TokenSource.Token) : CompletedTask; 87 Delay = !dueTime.Equals(0) ? Task.Delay(dueTime, tokenSource.Token) : CompletedTask;
-   88 if (Delay.IsCompleted)
-   89 return;
-   90 Delay.ContinueWith(t => tick(), tokenSource.Token);
-   91 }
-   92  
95 if (Delay.IsCompleted) 93 public void Change(int dueTime, int period)
96 return; 94 {
-   95 Change(TimeSpan.FromMilliseconds(dueTime), TimeSpan.FromMilliseconds(period));
97 Delay.ContinueWith(t => tick(), TokenSource.Token); 96 }
-   97  
-   98 public void Change(uint dueTime, int period)
98 } 99 {
-   100 Change(TimeSpan.FromMilliseconds(dueTime), TimeSpan.FromMilliseconds(period));
99   101 }
100 public void Stop() 102  
101 { 103 public void Change(TimeSpan dueTime, TimeSpan period)
102 Change(0, 0); 104 {
103 } 105 this.dueTime = dueTime;