public async Task <IEnumerable <ElementState> > RunAsync() { var results = new List <ElementState>(); //Parallel.ForEach(_tests.Where(t => t.IsDue), async test => { }); foreach (var test in Tests.Where(t => t.IsDue)) { try { var result = await test.ExecuteAsync(); lock (results) { results.Add(result); } await _stateProcessor.ProcessAsync(test.Definition, result); await _ruleProcessor.ProcessAsync(test.Definition, result); Log.Debug("Test {type} ({id}) {state}", test.GetType().Name, test.Id, result); } catch (Exception ex) { Log.Error(ex, ex.Message); } } // @TODO: So, if we're actually writing stuff away to the db as part of this, then it might take a while: We might be // better off queing it up for later, and doing some kind of batch insert. await _valuesRepository.Add(results); return(results); }
/// <summary> /// Return results of Argos instances have been updated /// </summary> /// <returns></returns> public async Task <IEnumerable <ArgosResult> > RunAsync() { var items = new List <ArgosResult>(); foreach (var instance in Instances.Where(a => a.IsDue)) { try { //Log.Debug("Running {type} - {name}", instance.GetType().Name, instance.Id); // Run instance var result = await instance.RunAsync(); await _stateProcessor.ProcessAsync(instance.Definition, result.Items); await _ruleProcessor.ProcessAsync(instance.Definition, result.Items); // Check if state has changed since last time ArgosResult previous = null; if (_state.ContainsKey(instance.Id)) { previous = _state[instance.Id]; } if (!Compare.IsEqual(result, previous)) { items.Add(result); // #hack: dump result Log.Debug(result.ToString()); } _state[instance.Id] = result.Copy(); } catch (Exception ex) { Log.Error(ex, ex.Message); } } #region original //// Get any argos definitions who's heartbeat is due //foreach (var definition in GetDue()) // { // try // { // ArgosResult lastRun; // if (_state.ContainsKey(definition.Id)) // { // lastRun = _state[definition.Id]; // } // else // { // lastRun = new ArgosResult(); // _state.Add(definition.Id, lastRun); // } // var argos = _argos.Single(t => t.GetType().Name == definition.Type); // //Validate(testdefinition, test.Meta); // Log.Debug("Running {type} - {name}", argos.GetType().Name, definition.Id); // var rs = await argos.RunAsync(definition); // foreach(var item in rs.Items) // { // await _stateProcessor.ProcessAsync(definition, item); // await _ruleProcessor.ProcessAsync(definition, item); // } // if (!Compare.ArgosResultsAreEqual(rs, lastRun)) // { // //Log.Information("{argos} '{id}' Has changed: " + rs, // // argos.GetType().Name, // // definition.Id); // items.Add(rs); // } // _state[definition.Id] = rs; // } // catch (Exception ex) // { // Log.Error(ex, ex.Message); // } // } #endregion return(items); }