diff --git a/Library/FlowNode/FlowContext.cs b/Library/FlowNode/FlowContext.cs index f5227a1..44b6c2e 100644 --- a/Library/FlowNode/FlowContext.cs +++ b/Library/FlowNode/FlowContext.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Reactive.Concurrency; using System.Security.Cryptography.X509Certificates; using System.Threading; @@ -30,9 +31,11 @@ namespace Serein.Library /// /// 用于同一个流程上下文中共享、存储任意数据 /// 流程完毕时,如果存储的对象实现了 IDisposable 接口,将会自动调用 - /// 谨慎使用,注意数据的生命周期和内存管理 + /// 该属性的 set 仅限内部访问,如需赋值,请通过 SetTag() + /// 请谨慎使用,请注意数据的生命周期和内存管理 /// - public object? Tag { get; set; } + public object? Tag { get;private set; } + /// @@ -257,6 +260,73 @@ namespace Serein.Library throw new InvalidOperationException($"透传{nodeModel}节点数据时发生异常:上一节点不存在数据"); } + private object _tagLockObj = new object(); + + /// + /// 设置共享对象,不建议设置非托管对象 + /// + /// + private void SetTag(object tag) + { + lock (_tagLockObj) + { + Tag = tag; + } + } + + /// + /// 获取共享对象(将在同一个 Web Socket 调起的上下文中保持一致) + /// + /// + private T? GetTag() + { + TryGetTag(out T? tag); + return tag; + } + +#if NET6_0_OR_GREATER + /// + /// 获取共享对象(将在同一个 Web Socket 调起的上下文中保持一致) + /// + /// + /// + private bool TryGetTag([NotNullWhen(true)] out T? tag) + { + lock (_tagLockObj) + { + if (Tag is T t) + { + tag = t; + return true; + } + tag = default; + return false; + } + } + +#else + /// + /// 获取共享对象(将在同一个 Web Socket 调起的上下文中保持一致) + /// + /// + /// + private bool TryGetTag(out T? tag) + { + lock (_tagLockObj) + { + if (Tag is T t) + { + tag = t; + return true; + } + tag = default; + return false; + } + } + +#endif + + /// /// 重置 ///