using Serein.Library.Api; using Serein.Library.Entity; using Serein.Library.Enums; using Serein.Library.Ex; using Serein.Library.Utils; using Serein.NodeFlow.Base; using static Serein.Library.Utils.ChannelFlowInterrupt; namespace Serein.NodeFlow.Model { public class SingleFlipflopNode : NodeModelBase { //public override async Task Executing(IDynamicContext context) //public override Task ExecutingAsync(IDynamicContext context) //{ // NextOrientation = Library.Enums.ConnectionType.IsError; // RuningException = new FlipflopException ("无法以非await/async的形式调用触发器"); // return null; //} public override async Task ExecutingAsync(IDynamicContext context) { #region 执行前中断 if (DebugSetting.InterruptClass != InterruptClass.None) // 执行触发前 { string guid = this.Guid.ToString(); var cancelType = await this.DebugSetting.GetInterruptTask(); await Console.Out.WriteLineAsync($"[{this.MethodDetails.MethodName}]中断已{cancelType},开始执行后继分支"); } #endregion MethodDetails md = MethodDetails; if (!context.Env.TryGetDelegateDetails(md.MethodName, out var dd)) { throw new Exception("不存在对应委托"); } object instance = md.ActingInstance; try { Task flipflopTask; var args = GetParameters(context, this, md); var delType = dd.EmitMethodType; var del = dd.EmitDelegate; if (delType == EmitHelper.EmitMethodType.HasResultTask && del is Func> hasResultTask) { var flipflopTaskObj = await hasResultTask(instance, args); if(flipflopTaskObj is IFlipflopContext flipflopContext) { NextOrientation = flipflopContext.State.ToContentType(); if (flipflopContext.TriggerData is null || flipflopContext.TriggerData.Type == Library.NodeFlow.Tool.TriggerType.Overtime) { throw new FlipflopException(base.MethodDetails.MethodName + "触发器超时触发。Guid" + base.Guid); } return flipflopContext.TriggerData.Value; } else { throw new FlipflopException("触发器节点返回了非预期的类型", true, FlipflopException.CancelClass.Flow); } } else { throw new FlipflopException("触发器节点构造了非预期的委托", true, FlipflopException.CancelClass.Flow); } } catch (FlipflopException ex) { if(ex.Clsss == FlipflopException.CancelClass.Flow) { throw; } await Console.Out.WriteLineAsync($"触发器[{this.MethodDetails.MethodName}]异常:" + ex.Message); NextOrientation = ConnectionType.None; RuningException = ex; return null; } catch (Exception ex) { await Console.Out.WriteLineAsync($"触发器[{this.MethodDetails.MethodName}]异常:" + ex.Message); NextOrientation = ConnectionType.IsError; RuningException = ex; return null; } finally { // flipflopTask?.Dispose(); } } internal override Parameterdata[] GetParameterdatas() { if (base.MethodDetails.ExplicitDatas.Length > 0) { return MethodDetails.ExplicitDatas .Select(it => new Parameterdata { State = it.IsExplicitData, Value = it.DataValue }) .ToArray(); } else { return []; } } } }