wasSharp – Blame information for rev 10

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