示例#1
0
文件: Workflow.cs 项目: lulzzz/daipan
        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}");
                            }
                        }
                    }
                });
            }
        }
示例#2
0
文件: Activity.cs 项目: lulzzz/daipan
 /// <summary>
 ///
 /// </summary>
 /// <param name="args"></param>
 protected void FinishActivity(OnActivityFinishedEventArgs args)
 {
     Finished?.Invoke(this, args);
 }