public void Activity_Finished(object sender, OnActivityFinishedEventArgs e) { _runningActivities.TryRemove(e.Status.ActivityId, out var finishedActivity); if (DelayTime != 0) { Task.Delay(DelayTime).Wait(); } var possibleTransitions = GetTransitionsWithFrom(e.Status.ActivityId); foreach (var pT in possibleTransitions) { Task.Run(() => { if (pT.CheckCondition(StateToken)) { var nextActivity = GetActivity(pT.To); if (nextActivity == null) { logger.Error($"A fired transition with id {pT.Id} referenced an activity with id {pT.To} that was not found"); return; } else { if (!_runningActivities.ContainsKey(nextActivity.Id)) { if (!_incomingTransitionsOfActivities.ContainsKey(nextActivity.Id)) { _incomingTransitionsOfActivities[nextActivity.Id] = new List <int>(); } _incomingTransitionsOfActivities[nextActivity.Id].Add(pT.Id); bool isRunActivity = false; switch (nextActivity.Guard) { case Activity.GuardType.And: var requiredTrueTransitions = GetTransitionsWithTo(nextActivity.Id).Select(t => t.Id); if (requiredTrueTransitions.All(rtt => _incomingTransitionsOfActivities[nextActivity.Id].Contains(rtt))) { isRunActivity = true; } break; case Activity.GuardType.Or: isRunActivity = true; break; default: break; } if (isRunActivity) { _runningActivities[nextActivity.Id] = Task.Run(() => { var parameters = GetParamObjectForActivity(nextActivity); nextActivity.Run(_cancelationToken, StateToken, parameters); }, _cancelationToken); //needs parameters _incomingTransitionsOfActivities.TryRemove(e.Status.ActivityId, out var finishedActivityTransitionList); } } else { var state = _runningActivities[nextActivity.Id].Status.ToString(); logger.Trace($"Did not start activity {nextActivity.Id} as it was already running in state {state}"); } } } }); } }
/// <summary> /// /// </summary> /// <param name="args"></param> protected void FinishActivity(OnActivityFinishedEventArgs args) { Finished?.Invoke(this, args); }