Horizon – Blame information for rev 4

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 using System;
2 using System.Threading;
3 using System.Threading.Tasks;
4  
5 namespace Horizon.Utilities
6 {
7 public class ScheduledContinuation : IDisposable
8 {
9 #region Constructors, Destructors and Finalizers
10  
11 public void Dispose()
12 {
13 if (_cancellationTokenSource != null)
14 {
15 _cancellationTokenSource?.Cancel();
16 _cancellationTokenSource?.Dispose();
17 _cancellationTokenSource = null;
18 }
19 }
20  
21 #endregion
22  
23 #region Private Delegates, Events, Enums, Properties, Indexers and Fields
24  
25 private CancellationTokenSource _cancellationTokenSource;
26  
27 private Task _task;
28  
29 #endregion
30  
31 #region Public Methods
32  
33 public void Schedule(TimeSpan delay, Action execute, CancellationToken cancellationToken)
34 {
35 try
36 {
37 if (_task != null)
38 {
39 _cancellationTokenSource?.Cancel();
40 _cancellationTokenSource?.Dispose();
41 _cancellationTokenSource = null;
42 _task = null;
43 }
44 }
45 catch
46 {
47 // Ignore errors.
48 }
49 finally
50 {
51 _cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
52 }
53  
54 _task = Task.Delay(delay, _cancellationTokenSource.Token)
55 .ContinueWith(task =>
56 {
57 try
58 {
59 execute.Invoke();
60 }
61 catch (Exception exception) when (exception is ObjectDisposedException ||
62 exception is OperationCanceledException)
63 {
64 }
65 }, _cancellationTokenSource.Token);
66 }
67  
68 public void Schedule(int delay, Action execute, CancellationToken cancellationToken)
69 {
70 try
71 {
72 if (_task != null)
73 {
74 _cancellationTokenSource?.Cancel();
75 _cancellationTokenSource?.Dispose();
76 _cancellationTokenSource = null;
77 _task = null;
78 }
79 }
80 catch
81 {
82 // Ignore errors.
83 }
84 finally
85 {
86 _cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
87 }
88  
89 _task = Task.Delay(delay, _cancellationTokenSource.Token)
90 .ContinueWith(task =>
91 {
92 try
93 {
94 execute.Invoke();
95 }
96 catch (Exception exception) when (exception is ObjectDisposedException ||
97 exception is OperationCanceledException)
98 {
99 }
100 }, _cancellationTokenSource.Token);
101 }
102  
103 #endregion
104 }
105 }