1. 修改了FlowResult的创建方式,新增了IsSuccess与Message,为后续进行流程日志追踪准备。

2. 修复了删除节点时,没有正确消除与之相关的参数获取关系。
3. IFlowNode新增了StartFlowAsync方法。
4. Library项目中FlowNodeExtension拓展类转移到了NodeFlow项目中。
5.  修改了Script自定义参数保存,对参数类型、返回值类型进行保存。
6. Library.Utils.BenchmarkHelpter中添加了Task、Task<>的重载方法。
7. NodeFlow项目中,FlowEnvironment默认使用通过NewtonsoftJson实现的JSON门户类。
8. NodeFlow项目中,FlowControl缓存了 FlowWorkOptions 选项实体,并且对于 FlowWorkManagement 进行了池化管理(但后续的项目中考虑重构流程任务运行时)。
This commit is contained in:
fengjiayi
2025-07-30 11:29:12 +08:00
parent 8dc7f5dd9b
commit 48289dae11
27 changed files with 965 additions and 106 deletions

View File

@@ -265,7 +265,8 @@ namespace Serein.Library.Api
}
else
{
Result = value.ToString();
var type = value.GetType();
Result = $"{type.FullName}::{value}";
}
}
public void UploadParameters(object[] values = null)

View File

@@ -120,5 +120,13 @@ namespace Serein.Library.Api
/// <param name="token"></param>
/// <returns></returns>
Task<FlowResult> ExecutingAsync(IFlowContext context, CancellationToken token);
/// <summary>
/// 以该节点开始执行流程,通常用于流程的入口节点。
/// </summary>
/// <param name="context"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<FlowResult> StartFlowAsync(IFlowContext context, CancellationToken token);
}
}

View File

@@ -224,7 +224,7 @@ namespace Serein.Library
/// <param name="data"></param>
public void AddOrUpdate(string nodeModel, object data)
{
var flowData = new FlowResult(nodeModel, this, data);
var flowData = FlowResult.OK(nodeModel, this, data);
dictNodeFlowData.AddOrUpdate(nodeModel, _ => flowData, (o, n) => flowData);
}

View File

@@ -31,23 +31,35 @@ namespace Serein.Library
/// </summary>
/// <param name="nodeGuid"></param>
/// <param name="context"></param>
public FlowResult(string nodeGuid, IFlowContext context, object value)
public static FlowResult OK(string nodeGuid, IFlowContext context, object value)
{
this.SourceNodeGuid = nodeGuid;
this.ContextGuid = context.Guid;
this.Value = value;
FlowResult flowResult = new FlowResult
{
SourceNodeGuid = nodeGuid,
ContextGuid = context.Guid,
Value = value,
IsSuccess = true,
};
return flowResult;
}
/// <summary>
/// 空返回值
/// 失败
/// </summary>
/// <param name="nodeGuid"></param>
/// <param name="context"></param>
public FlowResult(string nodeGuid, IFlowContext context)
/// <param name="message"></param>
public static FlowResult Fail(string nodeGuid, IFlowContext context, string message)
{
this.SourceNodeGuid = nodeGuid;
this.ContextGuid = context.Guid;
this.Value = Unit.Default;
FlowResult flowResult = new FlowResult
{
SourceNodeGuid = nodeGuid,
ContextGuid = context.Guid,
Value = Unit.Default,
IsSuccess = true,
Message = message,
};
return flowResult;
}
/// <summary>
@@ -72,16 +84,26 @@ namespace Serein.Library
return false;
}
/// <summary>
/// 指示是否成功
/// </summary>
public bool IsSuccess { get; set; }
/// <summary>
/// 执行结果消息(提示异常)
/// </summary>
public string Message { get; set; } = string.Empty;
/// <summary>
/// 来源节点Guid
/// </summary>
public string SourceNodeGuid{ get; }
public string SourceNodeGuid{ get; private set; }
/// <summary>
/// 来源上下文Guid
/// </summary>
public string ContextGuid { get; }
public string ContextGuid { get; private set; }
/// <summary>
/// 数据值
/// </summary>

View File

@@ -300,7 +300,7 @@ namespace Serein.Library
}
catch (Exception ex)
{
flowResult = new FlowResult(currentNode.Guid, context);
flowResult = FlowResult.Fail(currentNode.Guid, context, ex.Message);
context.Env.WriteLine(InfoType.ERROR, $"节点[{currentNode}]异常:" + ex);
context.NextOrientation = ConnectionInvokeType.IsError;
context.ExceptionOfRuning = ex;

View File

@@ -55,6 +55,7 @@
</ItemGroup>
<ItemGroup>
<Compile Remove="Extension\FlowModelExtension.cs" />
<Compile Remove="FlowNode\Attribute.cs" />
<Compile Remove="FlowNode\NodeModelBaseData.cs" />
<Compile Remove="FlowNode\NodeModelBaseFunc.cs" />

View File

@@ -74,6 +74,36 @@ namespace Serein.Library.Utils
SereinEnv.WriteLine(InfoType.INFO, $"最小耗时:{min} 毫秒");
SereinEnv.WriteLine(InfoType.INFO, $"平均耗时:{avg} 毫秒");
}
/// <summary>
/// 运行指定异步方法多次并输出耗时的最大、最小和平均值。
/// </summary>
/// <param name="task">需要执行的异步方法</param>
/// <param name="count">执行次数默认10000</param>
public static async Task BenchmarkAsync(Task task, int count = 10000)
{
double max = double.MinValue;
double min = double.MaxValue;
double total = 0;
for (int i = 0; i < count; i++)
{
var sw = Stopwatch.StartNew();
await task;
sw.Stop();
double ms = sw.Elapsed.TotalMilliseconds;
if (ms > max) max = ms;
if (ms < min) min = ms;
total += ms;
}
double avg = total / count;
SereinEnv.WriteLine(InfoType.INFO, $"运行 {count} 次:");
SereinEnv.WriteLine(InfoType.INFO, $"总耗时 :{total} 毫秒:");
SereinEnv.WriteLine(InfoType.INFO, $"最大耗时:{max} 毫秒");
SereinEnv.WriteLine(InfoType.INFO, $"最小耗时:{min} 毫秒");
SereinEnv.WriteLine(InfoType.INFO, $"平均耗时:{avg} 毫秒");
}
/// <summary>
/// 运行指定异步方法多次并输出耗时的最大、最小和平均值。
@@ -99,6 +129,38 @@ namespace Serein.Library.Utils
//Console.WriteLine($"第{count}次: 耗时 {ms} ms");
}
double avg = total / count;
SereinEnv.WriteLine(InfoType.INFO, $"运行 {count} 次:");
SereinEnv.WriteLine(InfoType.INFO, $"总耗时 :{total} 毫秒:");
SereinEnv.WriteLine(InfoType.INFO, $"最大耗时:{max} 毫秒");
SereinEnv.WriteLine(InfoType.INFO, $"最小耗时:{min} 毫秒");
SereinEnv.WriteLine(InfoType.INFO, $"平均耗时:{avg} 毫秒");
return result;
}
/// <summary>
/// 运行指定异步方法多次并输出耗时的最大、最小和平均值。
/// </summary>
/// <param name="task">需要执行的异步方法</param>
/// <param name="count">执行次数默认10000</param>
public static async Task<TReult> BenchmarkAsync<TReult>(Task<TReult> task, int count = 10000)
{
double max = double.MinValue;
double min = double.MaxValue;
double total = 0;
TReult result = default;
for (int i = 0; i < count; i++)
{
var sw = Stopwatch.StartNew();
result = await task;
sw.Stop();
double ms = sw.Elapsed.TotalMilliseconds;
if (ms > max) max = ms;
if (ms < min) min = ms;
total += ms;
//Console.WriteLine($"第{count}次: 耗时 {ms} ms");
}
double avg = total / count;
SereinEnv.WriteLine(InfoType.INFO, $"运行 {count} 次:");
SereinEnv.WriteLine(InfoType.INFO, $"总耗时 :{total} 毫秒:");