public Task StartMonitor(CancellationToken externalCancellationToken = default(CancellationToken)) { if (MonitorState == MonitorState.Running) { Log.Error("Trying to run a running monitor"); return(Task.CompletedTask); } CancellationTokenSource = new CancellationTokenSource(); //Link the current cancellation token with the given one, for support external cancellation if (externalCancellationToken != default(CancellationToken)) { CancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(externalCancellationToken, CancellationTokenSource.Token); CancellationTokenSource.Token.Register(UpdateState); } Prepare(); MonitorState = MonitorState.Prepared; Log.Information("Monitor {@Monitor} State: {@MonitorState}", this.GetType().Name, MonitorState); CancellationToken token = CancellationTokenSource.Token; return(Task.Factory.StartNew(() => { MonitorState = MonitorState.Running; Log.Information("Monitor {@Monitor} State: {@MonitorState}", this.GetType().Name, MonitorState); using (LogContext.PushProperty("MonitorName", this.GetType().Name)) { while (!CancellationTokenSource.IsCancellationRequested) { MonitorResult monitorResult = Action(); Log.Information("------------- {@monitorResult} -------------", monitorResult.ResultState); if (monitorResult.ResultState == ResultState.FAIL) { OnError(monitorResult); } try { Task.Delay(MonitorSettings.SamplingRate, token).Wait(); } catch (Exception) { break; } } } }, token)); }
protected virtual void OnError(MonitorResult monitorResult) { ErrorEvent?.Invoke(this, monitorResult); }