Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
PeriodicTimer.cs
Go to the documentation of this file.
4
5namespace System.Threading;
6
7public sealed class PeriodicTimer : IDisposable
8{
9 private sealed class State : IValueTaskSource<bool>
10 {
12
14
16
17 private bool _stopped;
18
19 private bool _signaled;
20
21 private bool _activeWait;
22
24 {
25 lock (this)
26 {
27 if (_activeWait)
28 {
30 }
31 if (cancellationToken.IsCancellationRequested)
32 {
34 }
35 if (_signaled)
36 {
37 if (!_stopped)
38 {
39 _signaled = false;
40 }
41 return new ValueTask<bool>(!_stopped);
42 }
43 _owner = owner;
44 _activeWait = true;
45 _ctr = cancellationToken.UnsafeRegister(delegate(object state, CancellationToken cancellationToken)
46 {
47 ((State)state).Signal(stopping: false, cancellationToken);
48 }, this);
49 return new ValueTask<bool>(this, _mrvtsc.Version);
50 }
51 }
52
53 public void Signal(bool stopping = false, CancellationToken cancellationToken = default(CancellationToken))
54 {
55 bool flag = false;
56 lock (this)
57 {
58 _stopped |= stopping;
59 if (!_signaled)
60 {
61 _signaled = true;
62 flag = _activeWait;
63 }
64 }
65 if (flag)
66 {
67 if (cancellationToken.IsCancellationRequested)
68 {
70 }
71 else
72 {
73 _mrvtsc.SetResult(result: true);
74 }
75 }
76 }
77
79 {
80 _ctr.Dispose();
81 lock (this)
82 {
83 try
84 {
85 _mrvtsc.GetResult(token);
86 }
87 finally
88 {
89 _mrvtsc.Reset();
91 _activeWait = false;
92 _owner = null;
93 if (!_stopped)
94 {
95 _signaled = false;
96 }
97 }
98 return !_stopped;
99 }
100 }
101
103 {
104 return _mrvtsc.GetStatus(token);
105 }
106
107 void IValueTaskSource<bool>.OnCompleted(Action<object> continuation, object state, short token, ValueTaskSourceOnCompletedFlags flags)
108 {
109 _mrvtsc.OnCompleted(continuation, state, token, flags);
110 }
111 }
112
113 private readonly TimerQueueTimer _timer;
114
115 private readonly State _state;
116
117 public PeriodicTimer(TimeSpan period)
118 {
119 long num = (long)period.TotalMilliseconds;
120 if (num < 1 || num > 4294967294u)
121 {
122 GC.SuppressFinalize(this);
123 throw new ArgumentOutOfRangeException("period");
124 }
125 _state = new State();
126 _timer = new TimerQueueTimer(delegate(object s)
127 {
128 ((State)s).Signal();
129 }, _state, (uint)num, (uint)num, flowExecutionContext: false);
130 }
131
136
137 public void Dispose()
138 {
139 GC.SuppressFinalize(this);
140 _timer.Close();
141 _state.Signal(stopping: true);
142 }
143
145 {
146 Dispose();
147 }
148}
static void SuppressFinalize(object obj)
Definition GC.cs:202
Definition GC.cs:8
ValueTask< bool > WaitForNextTickAsync(PeriodicTimer owner, CancellationToken cancellationToken)
CancellationTokenRegistration _ctr
void Signal(bool stopping=false, CancellationToken cancellationToken=default(CancellationToken))
ManualResetValueTaskSourceCore< bool > _mrvtsc
readonly TimerQueueTimer _timer
ValueTask< bool > WaitForNextTickAsync(CancellationToken cancellationToken=default(CancellationToken))
static void ThrowInvalidOperationException()
void OnCompleted(Action< object?> continuation, object? state, short token, ValueTaskSourceOnCompletedFlags flags)
ValueTaskSourceStatus GetStatus(short token)
void OnCompleted(Action< object?> continuation, object? state, short token, ValueTaskSourceOnCompletedFlags flags)
static ValueTask FromCanceled(CancellationToken cancellationToken)
Definition ValueTask.cs:180
double TotalMilliseconds
Definition TimeSpan.cs:46