wasSharp – Diff between revs 10 and 20

Subversion Repositories:
Rev:
Only display areas with differencesIgnore whitespace
Rev 10 Rev 20
1 /////////////////////////////////////////////////////////////////////////// 1 ///////////////////////////////////////////////////////////////////////////
2 // Copyright (C) Wizardry and Steamworks 2013 - License: GNU GPLv3 // 2 // Copyright (C) Wizardry and Steamworks 2013 - License: GNU GPLv3 //
3 // Please see: http://www.gnu.org/licenses/gpl.html for legal details, // 3 // Please see: http://www.gnu.org/licenses/gpl.html for legal details, //
4 // rights of fair usage, the disclaimer and warranty conditions. // 4 // rights of fair usage, the disclaimer and warranty conditions. //
5 /////////////////////////////////////////////////////////////////////////// 5 ///////////////////////////////////////////////////////////////////////////
6   6  
7 using System; 7 using System;
8 using System.Threading; 8 using System.Threading;
9 using System.Threading.Tasks; 9 using System.Threading.Tasks;
10   10  
11 namespace wasSharp.Timers 11 namespace wasSharp.Timers
12 { 12 {
13 public delegate void TimerCallback(object state); -  
14   -  
15 public class Timer : IDisposable 13 public class Timer : IDisposable
16 { 14 {
17 private static readonly Task CompletedTask = Task.FromResult(false); -  
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;
21 private bool Disposed; 18 private bool Disposed;
-   19 private TimeSpan dueTime;
22 private int Period; 20 private TimeSpan period;
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;
28 State = state; 26 this.dueTime = dueTime;
-   27 this.period = period;
29 Period = period; 28  
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)
34 : this(callback, state, (int) dueTime.TotalMilliseconds, (int) period.TotalMilliseconds) 33 : this(callback, TimeSpan.FromMilliseconds(dueTime), TimeSpan.FromMilliseconds(period))
35 { 34 {
36 } 35 }
37   36  
38 public Timer(TimerCallback callback) : this(callback, null, TimeSpan.Zero, TimeSpan.Zero) 37 public Timer(Action callback) : this(callback, TimeSpan.Zero, TimeSpan.Zero)
39 { 38 {
40 } 39 }
41   40  
-   41 public Timer(Action callback, double dueTime, int period)
42 public void Dispose() 42 : this(callback, TimeSpan.FromMilliseconds(dueTime), TimeSpan.FromMilliseconds(period))
43 { -  
44 Dispose(true); -  
45 GC.SuppressFinalize(this); 43 {
46 } 44 }
-   45  
47   46 public Timer(Action callback, uint dueTime, uint period)
48 ~Timer() -  
49 { 47 : this(callback, TimeSpan.FromMilliseconds(dueTime), TimeSpan.FromMilliseconds(period))
50 Dispose(false); 48 {
51 } 49 }
52   50  
-   51 public void Dispose()
53 private void Dispose(bool cleanUpManagedObjects) 52 {
-   53 if (tokenSource != null)
-   54 {
-   55 tokenSource.Cancel();
54 { 56 tokenSource.Dispose();
55 if (cleanUpManagedObjects) 57 tokenSource = null;
56 Cancel(); 58 }
57 Disposed = true; 59 Disposed = true;
58 } 60 }
59   61  
60 public void Change(int dueTime, int period) 62 private void Run()
61 { 63 {
62 Period = period; 64 // Cancel any previous timer.
63 Reset(dueTime); 65 if (tokenSource != null)
64 } -  
65   66 {
66 public void Change(uint dueTime, int period) -  
67 { 67 tokenSource.Cancel();
68 Period = period; 68 tokenSource.Dispose();
69 Change((int) dueTime, period); 69 tokenSource = null;
70 } 70 }
71   -  
72 public void Change(TimeSpan dueTime, TimeSpan period) 71  
73 { -  
74 Change((int) dueTime.TotalMilliseconds, (int) period.TotalMilliseconds); -  
75 } -  
76   -  
77 private void Reset(int due) -  
78 { -  
79 Cancel(); -  
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;
84 tick = () => 76 tick = () =>
85 { 77 {
86 Task.Run(() => Callback(State)); 78 Task.Run(() => callback(), tokenSource.Token);
87 if (Disposed) 79 if (Disposed)
88 return; 80 return;
89 Delay = Period > 0 ? Task.Delay(Period, TokenSource.Token) : CompletedTask; 81 Delay = !period.Equals(0) ? Task.Delay(period, tokenSource.Token) : CompletedTask;
90 if (Delay.IsCompleted) 82 if (Delay.IsCompleted)
91 return; 83 return;
92 Delay.ContinueWith(t => tick(), TokenSource.Token); 84 Delay.ContinueWith(t => tick(), tokenSource.Token);
93 }; 85 };
-   86  
94 Delay = due > 0 ? Task.Delay(due, TokenSource.Token) : CompletedTask; 87 Delay = !dueTime.Equals(0) ? Task.Delay(dueTime, tokenSource.Token) : CompletedTask;
95 if (Delay.IsCompleted) 88 if (Delay.IsCompleted)
96 return; 89 return;
97 Delay.ContinueWith(t => tick(), TokenSource.Token); 90 Delay.ContinueWith(t => tick(), tokenSource.Token);
98 } 91 }
99   92  
100 public void Stop() 93 public void Change(int dueTime, int period)
101 { 94 {
102 Change(0, 0); 95 Change(TimeSpan.FromMilliseconds(dueTime), TimeSpan.FromMilliseconds(period));
103 } 96 }
104   97  
-   98 public void Change(uint dueTime, int period)
-   99 {
-   100 Change(TimeSpan.FromMilliseconds(dueTime), TimeSpan.FromMilliseconds(period));
-   101 }
-   102  
105 private void Cancel() 103 public void Change(TimeSpan dueTime, TimeSpan period)
106 { 104 {
-   105 this.dueTime = dueTime;
107 if (TokenSource == null) 106 this.period = period;
-   107  
-   108 Run();
108 return; 109 }
-   110  
109 TokenSource.Cancel(); 111 public void Stop()
110 TokenSource.Dispose(); 112 {
111 TokenSource = null; 113 Change(0, 0);
112 } 114 }
113 } 115 }
114 } 116 }
115   117  
116
Generated by GNU Enscript 1.6.5.90.
118
Generated by GNU Enscript 1.6.5.90.
117   119  
118   120  
119   121