History

GSF.Core: Updated SharedTimer to check dispose in Enabled(set) after checking if there was an actual state change to better handle cases where Stop or Close could be called after Dispose.

J. Ritchie Carroll committed 6 years ago

Commit 3346f291 parent 460a9011 file · +21 −38Browse files

Showing the changes to Source/Libraries/GSF.Core.Shared/Threading/SharedTimer.cs (1 of 1 file). Show all

Unified · Split

Source/Libraries/GSF.Core.Shared/Threading/SharedTimer.cs+21−38
@@ -85,7 +85,7 @@ namespace GSF.Threading · 84 unmodified lines
8585 [EditorBrowsable(EditorBrowsableState.Never)]
8686 internal SharedTimer(SharedTimerScheduler scheduler, int interval = 100)
8787 {
88− if ((object)scheduler == null)
88+ if (scheduler == null)
8989 throw new ArgumentNullException(nameof(scheduler));
9090
9191 if (scheduler.IsDisposed)
@@ -118,10 +118,7 @@ namespace GSF.Threading · 26 unmodified lines
118118 /// </returns>
119119 public bool AutoReset
120120 {
121− get
122− {
123− return m_autoReset;
124− }
121+ get => m_autoReset;
125122 set
126123 {
127124 if (m_autoReset == value)
@@ -129,11 +126,11 @@ namespace GSF.Threading · 1 unmodified line
129126
130127 m_autoReset = value;
131128
132− if (value && m_enabled)
133− {
134− m_registeredCallback?.Clear();
135− m_registeredCallback = m_scheduler.RegisterCallback(m_interval, m_callback);
136− }
129+ if (!m_autoReset || !m_enabled)
130+ return;
131+
132+ m_registeredCallback?.Clear();
133+ m_registeredCallback = m_scheduler.RegisterCallback(m_interval, m_callback);
137134 }
138135 }
139136
@@ -146,18 +143,16 @@ namespace GSF.Threading · 6 unmodified lines
146143 /// </returns>
147144 public bool Enabled
148145 {
149− get
150− {
151− return m_enabled;
152− }
146+ get => m_enabled;
153147 set
154148 {
155− if (m_disposed)
156− throw new ObjectDisposedException(GetType().FullName);
157−
158149 if (m_enabled == value)
159150 return;
160151
152+ // Check dispose after checking if there was an actual state change (in case Stop or Close is called after Dispose)
153+ if (m_disposed)
154+ throw new ObjectDisposedException(GetType().FullName);
155+
161156 m_enabled = value;
162157
163158 if (!m_enabled)
@@ -177,10 +172,7 @@ namespace GSF.Threading · 13 unmodified lines
177172 /// </remarks>
178173 public int Interval
179174 {
180− get
181− {
182− return m_interval;
183− }
175+ get => m_interval;
184176 set
185177 {
186178 if (value <= 0)
@@ -191,11 +183,11 @@ namespace GSF.Threading · 4 unmodified lines
191183
192184 m_interval = value;
193185
194− if (m_enabled)
195− {
196− m_registeredCallback?.Clear();
197− m_registeredCallback = m_scheduler.RegisterCallback(m_interval, m_callback);
198− }
186+ if (!m_enabled)
187+ return;
188+
189+ m_registeredCallback?.Clear();
190+ m_registeredCallback = m_scheduler.RegisterCallback(m_interval, m_callback);
199191 }
200192 }
201193
@@ -206,10 +198,7 @@ namespace GSF.Threading · 4 unmodified lines
206198 /// <summary>
207199 /// Stops the timer.
208200 /// </summary>
209− public void Close()
210− {
211− Enabled = false;
212− }
201+ public void Close() => Enabled = false;
213202
214203 /// <summary>
215204 /// Stops the timer and prevents reuse of the class.
@@ -223,18 +212,12 @@ namespace GSF.Threading · 7 unmodified lines
223212 /// <summary>
224213 /// Starts raising the <see cref="Elapsed" /> event by setting <see cref="Enabled" /> to <c>true</c>.
225214 /// </summary>
226− public void Start()
227− {
228− Enabled = true;
229− }
215+ public void Start() => Enabled = true;
230216
231217 /// <summary>
232218 /// Stops raising the <see cref="Elapsed"/> event by setting <see cref="Enabled" /> to <c>false</c>.
233219 /// </summary>
234− public void Stop()
235− {
236− Enabled = false;
237− }
220+ public void Stop() => Enabled = false;
238221
239222 /// <summary>
240223 /// Callback from <see cref="SharedTimerScheduler"/>.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t