public void Dispose() { if (!_isDisposed) { SubscriptionTokenSource?.Dispose(); _isDisposed = true; GC.SuppressFinalize(this); } }
private void InitiateTask(SubscriptionTokenSource subscriptionTokenSource) { bool state() => _task == null || _task.IsCompleted; if (state()) { lock (_taskSync) { if (state()) { SubscriptionTokenSource?.Dispose(); SubscriptionTokenSource = subscriptionTokenSource; _task = Task.Run(async() => { //Initial delay await Task.Delay(Subscription.Execution.Interval).ConfigureAwait(false); while (!SubscriptionTokenSource.IsCancelled) { try { await SubscriptionTokenSource.PauseIfRequested().ConfigureAwait(false); await OnTaskRun().ConfigureAwait(false); } catch (Exception) { //Catch all exceptions and never allow to throw that causes application to crash. //TODO : internal logging } finally { _lastExecuted = DateTime.UtcNow; await Task.Delay(Subscription.Execution.Interval).ConfigureAwait(false); } } }, SubscriptionTokenSource.CancellationToken); } } } }