From 866a672e67d1c041474ad2241fcda021bab1db17 Mon Sep 17 00:00:00 2001 From: Darth Affe Date: Sun, 15 Dec 2019 12:18:39 +0100 Subject: [PATCH] Added locks to TimerUpdateTrigger --- RGB.NET.Core/Update/TimerUpdateTrigger.cs | 33 ++++++++++++++--------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/RGB.NET.Core/Update/TimerUpdateTrigger.cs b/RGB.NET.Core/Update/TimerUpdateTrigger.cs index 996b86f..23eaa96 100644 --- a/RGB.NET.Core/Update/TimerUpdateTrigger.cs +++ b/RGB.NET.Core/Update/TimerUpdateTrigger.cs @@ -14,11 +14,13 @@ namespace RGB.NET.Core { #region Properties & Fields + private object _lock = new object(); + private CancellationTokenSource _updateTokenSource; private CancellationToken _updateToken; private Task _updateTask; private Stopwatch _sleepCounter; - + private double _updateFrequency = 1.0 / 30.0; /// /// Gets or sets the update-frequency in seconds. (Calculate by using '1.0 / updates per second') @@ -33,7 +35,7 @@ namespace RGB.NET.Core /// Gets the time it took the last update-loop cycle to run. /// public double LastUpdateTime { get; private set; } - + #endregion #region Constructors @@ -59,25 +61,32 @@ namespace RGB.NET.Core /// public void Start() { - if (_updateTask == null) + lock (_lock) { - _updateTokenSource?.Dispose(); - _updateTokenSource = new CancellationTokenSource(); - _updateTask = Task.Factory.StartNew(UpdateLoop, (_updateToken = _updateTokenSource.Token), TaskCreationOptions.LongRunning, TaskScheduler.Default); + if (_updateTask == null) + { + _updateTokenSource?.Dispose(); + _updateTokenSource = new CancellationTokenSource(); + _updateTask = Task.Factory.StartNew(UpdateLoop, (_updateToken = _updateTokenSource.Token), TaskCreationOptions.LongRunning, TaskScheduler.Default); + } } } /// /// Stops the trigger if running, causing it to stop performing updates. /// - public async void Stop() + public void Stop() { - if (_updateTask != null) + lock (_lock) { - _updateTokenSource.Cancel(); - await _updateTask; - _updateTask.Dispose(); - _updateTask = null; + if (_updateTask != null) + { + _updateTokenSource.Cancel(); + // ReSharper disable once MethodSupportsCancellation + _updateTask.Wait(); + _updateTask.Dispose(); + _updateTask = null; + } } }