wasSharp – Blame information for rev 20

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 class Timer : IDisposable
14 {
20 office 15 private readonly Action callback;
16 private readonly Task CompletedTask = Task.FromResult(false);
10 office 17 private Task Delay;
18 private bool Disposed;
20 office 19 private TimeSpan dueTime;
20 private TimeSpan period;
21 private CancellationTokenSource tokenSource;
10 office 22  
20 office 23 public Timer(Action callback, TimeSpan dueTime, TimeSpan period)
10 office 24 {
20 office 25 this.callback = callback;
26 this.dueTime = dueTime;
27 this.period = period;
28  
29 Run();
10 office 30 }
31  
20 office 32 public Timer(Action callback, int dueTime, int period)
33 : this(callback, TimeSpan.FromMilliseconds(dueTime), TimeSpan.FromMilliseconds(period))
10 office 34 {
35 }
36  
20 office 37 public Timer(Action callback) : this(callback, TimeSpan.Zero, TimeSpan.Zero)
10 office 38 {
39 }
40  
20 office 41 public Timer(Action callback, double dueTime, int period)
42 : this(callback, TimeSpan.FromMilliseconds(dueTime), TimeSpan.FromMilliseconds(period))
10 office 43 {
44 }
45  
20 office 46 public Timer(Action callback, uint dueTime, uint period)
47 : this(callback, TimeSpan.FromMilliseconds(dueTime), TimeSpan.FromMilliseconds(period))
10 office 48 {
49 }
50  
20 office 51 public void Dispose()
10 office 52 {
20 office 53 if (tokenSource != null)
54 {
55 tokenSource.Cancel();
56 tokenSource.Dispose();
57 tokenSource = null;
58 }
10 office 59 Disposed = true;
60 }
61  
20 office 62 private void Run()
10 office 63 {
20 office 64 // Cancel any previous timer.
65 if (tokenSource != null)
66 {
67 tokenSource.Cancel();
68 tokenSource.Dispose();
69 tokenSource = null;
70 }
10 office 71  
20 office 72 // Create a new cancellation source.
73 tokenSource = new CancellationTokenSource();
10 office 74  
75 Action tick = null;
76 tick = () =>
77 {
20 office 78 Task.Run(() => callback(), tokenSource.Token);
10 office 79 if (Disposed)
80 return;
20 office 81 Delay = !period.Equals(0) ? Task.Delay(period, tokenSource.Token) : CompletedTask;
10 office 82 if (Delay.IsCompleted)
83 return;
20 office 84 Delay.ContinueWith(t => tick(), tokenSource.Token);
10 office 85 };
20 office 86  
87 Delay = !dueTime.Equals(0) ? Task.Delay(dueTime, tokenSource.Token) : CompletedTask;
10 office 88 if (Delay.IsCompleted)
89 return;
20 office 90 Delay.ContinueWith(t => tick(), tokenSource.Token);
10 office 91 }
92  
20 office 93 public void Change(int dueTime, int period)
10 office 94 {
20 office 95 Change(TimeSpan.FromMilliseconds(dueTime), TimeSpan.FromMilliseconds(period));
10 office 96 }
97  
20 office 98 public void Change(uint dueTime, int period)
10 office 99 {
20 office 100 Change(TimeSpan.FromMilliseconds(dueTime), TimeSpan.FromMilliseconds(period));
10 office 101 }
20 office 102  
103 public void Change(TimeSpan dueTime, TimeSpan period)
104 {
105 this.dueTime = dueTime;
106 this.period = period;
107  
108 Run();
109 }
110  
111 public void Stop()
112 {
113 Change(0, 0);
114 }
10 office 115 }
116 }