diff --git a/Serein.Proto.WebSocket/SereinWebSocketService.cs b/Serein.Proto.WebSocket/SereinWebSocketService.cs index 277ebaa..4999ed0 100644 --- a/Serein.Proto.WebSocket/SereinWebSocketService.cs +++ b/Serein.Proto.WebSocket/SereinWebSocketService.cs @@ -335,10 +335,7 @@ namespace Serein.Proto.WebSocket return context; }, context => { - context.MsgRequest = null; - context.MsgData = null; - context.ErrorMessage = null; - context.Model = null; + context.Reset(); }); while (webSocket.State == WebSocketState.Open) diff --git a/Serein.Proto.WebSocket/WebSocketHandleContext.cs b/Serein.Proto.WebSocket/WebSocketHandleContext.cs index 2c0a4b9..ab7477f 100644 --- a/Serein.Proto.WebSocket/WebSocketHandleContext.cs +++ b/Serein.Proto.WebSocket/WebSocketHandleContext.cs @@ -2,6 +2,7 @@ using Serein.Library.Utils; using Serein.Proto.WebSocket.Handle; using System; +using System.Diagnostics.CodeAnalysis; using System.Threading.Tasks; using static System.Runtime.InteropServices.JavaScript.JSType; @@ -11,7 +12,7 @@ namespace Serein.Proto.WebSocket /// /// 消息处理上下文 /// - public class WebSocketHandleContext : IDisposable + public class WebSocketHandleContext { /// /// 构造函数,传入发送消息的异步方法 @@ -23,34 +24,26 @@ namespace Serein.Proto.WebSocket } /// - /// 释放资源,清理消息上下文 + /// 重置上下文 /// - public void Dispose() + public void Reset() { MsgRequest = null; - /*MsgTheme = string.Empty; - MsgId = string.Empty; */ - MsgData = null; MsgData = null; + ErrorMessage = null; + Model = null; + IsError = false; } /// /// 标记是否已经处理,如果是,则提前退出 /// - public bool Handle { get => _handle; set{ - if(value) - { - Dispose(); - _handle = value; - } - } } - - private bool _handle = false; + public bool Handle { get; set; } /// /// WebSocket 模块配置 /// - public ModuleConfig Model { get; set; } + public ModuleConfig Model { get; set; } /// /// 消息本体(IJsonToken) @@ -62,16 +55,6 @@ namespace Serein.Proto.WebSocket /// public IJsonToken? MsgData { get; set; } - /// - /// 异常外部感知使能 - /// - public Action? OnExceptionTracking { get; set; } - - /// - /// 处理回复消息的函数 - /// - public Func OnReplyMakeData { get; set; } - public Action? OnReply { get; set; } /// /// 是否发生错误 @@ -83,12 +66,66 @@ namespace Serein.Proto.WebSocket /// public string ErrorMessage { get; set; } + + /// + /// 用于在同一个 Web Socket 中调用上下文中, 共享某个对象 + /// + private object? _wsTag; + private object _wsTagLockObj = new object(); + + /// + /// 设置共享对象(将在同一个 Web Socket 调起的上下文中保持一致) + /// + /// + /// + private void SetTag(T tag) + { + lock (_wsTagLockObj) + { + _wsTag = tag; + } + } + + /// + /// 获取共享对象(将在同一个 Web Socket 调起的上下文中保持一致) + /// + /// + /// + private bool TryGetTag([NotNullWhen(true)] out T? tag) + { + lock (_wsTagLockObj) + { + if (_wsTag is T t) + { + tag = t; + return true; + } + tag = default; + return false; + } + } + + /// + /// 异常外部感知使能 + /// + public Action? OnExceptionTracking { get; set; } + + /// + /// 处理回复消息的函数 + /// + public Func OnReplyMakeData { get; set; } + + /// + /// 获取回复内容的回调 + /// + public Action? OnReply { get; set; } /// /// 发送消息 /// private Func _sendAsync; + /// /// 发送消息 ///