修改了logwindows输出,避免高频输出时卡死。修改了流程运行上下文,使节点具备终止分支运行的能力。

This commit is contained in:
fengjiayi
2024-10-14 17:29:28 +08:00
parent f76f09da94
commit 4338554384
93 changed files with 4640 additions and 541 deletions

View File

@@ -1,4 +1,5 @@
using Serein.Library.Utils;
using Serein.Library.Enums;
using Serein.Library.Utils;
using System;
using System.Threading.Tasks;
@@ -13,14 +14,35 @@ namespace Serein.Library.Api
/// 运行环境包含IOC容器。
/// </summary>
IFlowEnvironment Env { get; }
RunState RunState { get; }
/// <summary>
/// 获取节点的数据(当前节点需要获取上一节点数据时,需要从 运行时上一节点 的Guid 通过这个方法进行获取
/// </summary>
/// <param name="nodeGuid"></param>
/// <returns></returns>
object GetFlowData(string nodeGuid);
/// <summary>
/// 添加或更新当前节点的数据
/// </summary>
/// <param name="nodeGuid"></param>
/// <param name="flowData"></param>
void AddOrUpdate(string nodeGuid, object flowData);
/// <summary>
/// 用以提前结束分支运行
/// </summary>
void EndCurrentBranch();
/*/// <summary>
/// 定时循环触发
/// </summary>
/// <param name="callback"></param>
/// <param name="time"></param>
/// <param name="count"></param>
/// <returns></returns>
// Task CreateTimingTask(Action callback, int time = 100, int count = -1);
}
// Task CreateTimingTask(Action callback, int time = 100, int count = -1);*/
}
}

View File

@@ -379,7 +379,8 @@ namespace Serein.Library.Api
{
#region
/// <summary>
/// IOC容器
/// <para>单例模式IOC容器内部维护了一个实例字典默认使用类型的FullName作为Key如果以“接口-实现类”的方式注册那么将使用接口类型的FullName作为Key。</para>
/// <para>当某个类型注册绑定成功后,将不会因为其它地方尝试注册相同类型的行为导致类型被重新创建。</para>
/// </summary>
ISereinIOC IOC { get; }
@@ -387,12 +388,26 @@ namespace Serein.Library.Api
/// 环境名称
/// </summary>
string EnvName { get; }
/// <summary>
/// 是否全局中断
/// </summary>
bool IsGlobalInterrupt { get; }
/// <summary>
/// DLL中NodeAction特性的方法描述的所有原始副本
/// </summary>
Dictionary<NodeLibrary, List<MethodDetails>> MethodDetailss { get; }
/// <summary>
/// 流程运行状态
/// </summary>
RunState FlowState { get; set; }
/// <summary>
/// 全局触发器运行状态
/// </summary>
RunState FlipFlopState { get; set; }
#endregion
@@ -545,15 +560,22 @@ namespace Serein.Library.Api
/// <param name="fromNodeGuid">起始节点</param>
/// <param name="toNodeGuid">目标节点</param>
/// <param name="connectionType">连接类型</param>
void RemoteConnect(string fromNodeGuid, string toNodeGuid, ConnectionType connectionType);
void RemoveConnect(string fromNodeGuid, string toNodeGuid, ConnectionType connectionType);
/// <summary>
/// 移除节点/区域/基础控件
/// </summary>
/// <param name="nodeGuid">待移除的节点Guid</param>
void RemoteNode(string nodeGuid);
void RemoveNode(string nodeGuid);
// 启动触发器
/// <summary>
/// 激活未启动的全局触发器
/// </summary>
/// <param name="nodeGuid"></param>
void ActivateFlipflopNode(string nodeGuid);
/// <summary>
/// 终结一个全局触发器,在它触发后将不会再次监听消息(表现为已经启动的触发器至少会再次处理一次消息,后面版本再修正这个非预期行为)
/// </summary>
/// <param name="nodeGuid"></param>
void TerminateFlipflopNode(string nodeGuid);

View File

@@ -178,7 +178,7 @@ namespace Serein.Library.Entity
public Position Position { get; set; }
/// <summary>
/// 是否选中
/// 是否选中(暂时无效)
/// </summary>
public bool IsSelect { get; set; }
}
@@ -188,8 +188,17 @@ namespace Serein.Library.Entity
/// </summary>
public class Parameterdata
{
/// <summary>
/// 参数类型true时使用自定义的入参false时由运行环境自动传参
/// </summary>
public bool State { get; set; }
/// <summary>
/// 自定义入参
/// </summary>
public string Value { get; set; }
/// <summary>
/// 表达式相关节点的表达式内容
/// </summary>
public string Expression { get; set; }
}
@@ -200,6 +209,9 @@ namespace Serein.Library.Entity
/// </summary>
public class Position
{
/// <summary>
/// 构造一个坐标
/// </summary>
public Position(double x, double y)
{
this.X = x; this.Y = y;

27
Library/Enums/RunState.cs Normal file
View File

@@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Serein.Library.Enums
{
/// <summary>
/// 流程运行状态
/// </summary>
public enum RunState
{
/// <summary>
/// 初始化值,等待开始。只有初始化时才会存在该值,后续每次重新开始都是从 Completion 变成 Running
/// </summary>
NoStart,
/// <summary>
/// 正在运行
/// </summary>
Running,
/// <summary>
/// 运行完成
/// </summary>
Completion,
}
}

View File

@@ -34,6 +34,12 @@ namespace Serein.Library.Network.WebSocketCommunication.Handle
/// </summary>
public event Action<Exception, Action<object>> OnExceptionTracking;
/// <summary>
/// 添加消息处理与异常处理
/// </summary>
/// <param name="themeKeyName"></param>
/// <param name="dataKeyName"></param>
/// <returns></returns>
private WebSocketHandleModule AddMyHandleModule(string themeKeyName, string dataKeyName)
{
var key = (themeKeyName, dataKeyName);
@@ -45,7 +51,11 @@ namespace Serein.Library.Network.WebSocketCommunication.Handle
return myHandleModule;
}
public void RemoteModule(ISocketHandleModule socketControlBase)
/// <summary>
/// 移除某个模块的WebSocket消息处理
/// </summary>
/// <param name="socketControlBase"></param>
public void RemoveModule(ISocketHandleModule socketControlBase)
{
var type = socketControlBase.GetType();
var moduleAttribute = type.GetCustomAttribute<AutoSocketModuleAttribute>();
@@ -66,7 +76,7 @@ namespace Serein.Library.Network.WebSocketCommunication.Handle
/// <summary>
/// 添加
/// 添加消息处理以及异常处理
/// </summary>
/// <param name="socketControlBase"></param>
/// <param name="onExceptionTracking"></param>

View File

@@ -50,6 +50,12 @@ namespace Serein.Library.Utils
}
}
/// <summary>
/// 根据方法信息创建动态调用的委托,返回方法类型,以及传出一个委托
/// </summary>
/// <param name="methodInfo"></param>
/// <param name="delegate"></param>
/// <returns></returns>
public static EmitMethodType CreateDynamicMethod( MethodInfo methodInfo,out Delegate @delegate)
{
bool IsTask = IsGenericTask(methodInfo.ReturnType, out var taskGenericsType);