跳到主要内容

v4.1.5

更新日期: 2026.3.1

更新描述:

  • 全局异步优化:所有 ConfigureAwait(EasyTask.ContinueOnCapturedContext) 调用统一改为 ConfigureDefaultAwait(),简化代码并提升异步性能表现。
  • PlcBridge驱动器架构重构:引入事件驱动机制替代轮询模式,大幅降低CPU占用率,提升驱动器执行效率。
  • 驱动器执行方法优化:将驱动器的读写方法返回类型从 Task 改为 ValueTask,减少不必要的堆分配。

更新详情:

All

  •   全局异步代码优化,将所有 ConfigureAwait(EasyTask.ContinueOnCapturedContext) 调用统一改为 ConfigureDefaultAwait(),简化代码结构并提升性能。

TouchSocket.Rpc

  •   当服务继承导致rpc方法进行重载时,会直接使用语法错误进行提示。

TouchSocketPro.PlcBridges

  •   引入 DriveRunner 类,采用事件驱动机制(AsyncManualResetEvent)替代传统轮询模式,驱动器仅在有读写请求时才执行,显著降低CPU占用率。
  •   PlcBridgeService.AddDriveAsync 方法优化驱动器添加逻辑:分组驱动器仅在未运行时启动,避免重复启动;独立分组驱动器先添加后启动,确保状态一致。
  •   PlcDrive<TValue> 抽象类中的 ExecuteReadAsyncExecuteWriteAsync 方法返回类型从 Task<Result> 改为 ValueTask<Result>,提升异步性能。
  •   PlcDrive 基类中的 OnExecuteAsync 方法返回类型从 Task<int> 改为 ValueTask<int>
  •   PlcDrive 新增 AsyncManualResetEvent 属性,配合 DriveRunner 实现按需执行机制。
  •   MemoryPlcDrive<TValue> 驱动器调整方法返回类型为 ValueTask<Result>,并使用 EasyValueTask.FromResult 提升性能。
  •   InternalPlcOperator<TValue> 操作类中所有异步等待统一使用 ConfigureDefaultAwait()

v4.1.4

更新日期: 2026.2.25

更新描述:

  • Metadata 类完全重构,不再继承 Dictionary<string, string>,支持超长值按 UTF-8 编码长度自动分段存储。
  • 新增 WriteVarString / ReadVarString 配套方法,提供可变长度编码的字符串序列化支持。
  • 移除 PackageBaseRouterPackage 中的 #if AllowsRefStruct 条件编译指令,简化代码结构。
  • 代码风格优化,多处 switch 语句改用 switch 表达式。

更新详情:

TouchSocket.Core

  •   WriterExtension.WriteVarString<TWriter> 方法,使用 VarUInt32 编码 UTF-8 字节长度(长度+1),支持 null 与空字符串的区分写入。
  •   ReaderExtension.ReadVarString<TReader> 方法,与 WriteVarString 配套,读取可变长度编码的 UTF-8 字符串。
  •   Metadata 类:从继承 Dictionary<string, string> 改为实现 IEnumerable<KeyValuePair<string, string>>,底层存储改为 List<KeyValuePair<string, string>>,支持值超过 254 字节(UTF-8)时自动分段存储与读取合并。

v4.1.2(3)

更新日期: 2026.2.12

更新描述:

  • 【新功能】TouchSocketPro新增Dmtp内网穿透(Relay)功能,支持端口映射和数据转发。
  • MQTT消息分发内存优化,使用引用计数和ArrayPool减少内存分配和GC压力。
  • 多个通信组件连接流程优化,确保事件触发顺序正确。
  • CheckClearPlugin增强日志,提供更详细的调试信息。
  • BytesReader性能优化,修复序列读取和释放逻辑。

更新详情:

TouchSocket.Core

  •   BytesReader.Sequence 属性使用 m_position 而不是 BytesRead,提升读取性能。
  •   BytesReader.Dispose 方法标记为 readonly,符合结构体最佳实践。

TouchSocket.Mqtt

  •   引入 SharedPayload 类支持引用计数的Payload共享,大幅减少内存复制。
  •   MqttArrivedMessage.Payload 类型从 ReadOnlyMemory<byte> 改为 ReadOnlySequence<byte>,支持零拷贝场景。
  •   MqttPublishMessage.Payload 类型从 ReadOnlyMemory<byte> 改为 ReadOnlySequence<byte>,统一内存模型。
  •   DistributeMessage 类,使用 SharedPayload 实现消息分发时的内存共享。
  •   MqttActor 使用 ConcurrentDictionary 替代 Dictionary 存储QoS2消息,提升并发性能。
  •   MqttActor 新增 PooledArrivedMessage 结构体,使用 ArrayPool 管理QoS2消息的内存生命周期。
  •   MqttSessionActor 消息分发流程增加异常处理,确保 SharedPayload 正确释放。
  •   MqttBroker.ForwardMessageAsync 方法返回已分发的订阅者数量,并优化多订阅者场景下的内存共享。
  •   SubscriptionThreadSafeTopicSubscriptions 类从 MqttBroker 中独立出来,提升代码模块化。

TouchSocket

  •   TcpClientBase.PrivateOnConnected 方法调整事件触发顺序:先触发 OnTcpConnected 事件,再启动接收循环。
  •   TcpSessionClientBase.PrivateOnConnected 方法调整事件触发顺序:先触发 OnTcpConnected 事件,再启动接收循环。
  •   CheckClearPlugin 添加详细的Debug和Warning级别日志,便于调试连接清理逻辑。
  •   TcpService 在当接收短链接数据时,无法接收数据。

TouchSocket.NamedPipe

  •   NamedPipeClientBase.PrivateConnected 方法调整事件触发顺序:先触发 OnNamedPipeConnected 事件,再启动接收循环。
  •   NamedPipeSessionClientBase.PrivateConnected 方法调整事件触发顺序:先触发 OnNamedPipeConnected 事件,再启动接收循环。

TouchSocket.SerialPorts

  •   SerialPortClientBase.PrivateConnected 方法调整事件触发顺序:先触发 OnSerialConnected 事件,再启动接收循环。

TouchSocketPro.Dmtp

  •   IDmtpRelayActor 接口,定义Dmtp内网穿透Actor的核心功能。

v4.1.1

更新日期: 2026.2.1

更新描述:

  • JSON序列化优化,新增全局默认配置选项。
  • 重连插件优化重连逻辑和错误处理。
  • HTTP响应增强,修复内容长度校验和流式写入问题。
  • DMTP关闭流程优化,先发送关闭消息再执行关闭。
  • PLC桥接服务修复,驱动运行器正确关联分组信息。

更新详情:

TouchSocket.Core

  •   TouchSocketCoreUtility.IsUrl 方法,使用 Uri.TryCreate 替代正则表达式,提升URL验证性能和准确性。
  •   SerializeConvert.DefaultJsonSerializerOptions 全局默认JSON序列化选项属性,允许用户自定义全局序列化配置。
  •   SerializeConvert.ToJsonString 方法使用全局默认选项进行序列化。
  •   SerializeConvert.FromJsonString 方法新增可选 jsonSerializerOptions 参数,支持自定义序列化选项(默认使用全局配置)。

TouchSocket.Http

  •   HttpResponse.WriteAsync 方法在无内容时自动添加 Content-Length: 0 头部。
  •   HttpResponse.WriteAsync 方法修正内容长度校验逻辑,当写入数据超过预期长度时抛出异常。
  •   HttpExtensions.CreateWriteStream 方法的 WriteAsync 重载缺少 cancellationToken 参数传递,现已正确传递取消令牌。

TouchSocket.Dmtp

  •   TcpDmtpSessionClient.CloseAsync 方法优化关闭流程,先调用 SendCloseAsync 发送关闭消息,再执行 CloseAsync 完成关闭。

TouchSocket

  •   ReconnectionOption<TClient> 构造函数简化 ConnectAction 逻辑,移除内置重连重试代码,仅保留连接调用。
  •   ReconnectionPlugin<TClient> 轮询任务使用 CancellationToken.None 替代插件的取消令牌,避免意外中断轮询。

TouchSocket.WebApi.Swagger

  •   SwaggerJsonSerializerContext JSON序列化上下文类,使用源生成器优化OpenAPI对象序列化性能。
  •   SwaggerPlugin.GetOpenApiJson 方法使用 SwaggerJsonSerializerContext.Default.OpenApiRoot 进行序列化,提升性能。

TouchSocketPro.PlcBridges

  •   PlcBridgeService.GetOrAddDriveRunner 方法创建 DriveRunner 时正确传递分组信息,而非使用GUID。

v4.1.0

更新日期: 2026.1.25

更新描述:

  • 【不兼容变更】默认JSON序列化器从Newtonsoft.Json切换到System.Text.Json,提升性能和AOT兼容性。
  • RPC代码生成器优化,移除同步代码生成相关逻辑,简化代码结构。
  • Swagger组件全面迁移到System.Text.Json,提升性能和内存使用。
  • Modbus主站扩展类精简,移除部分重复的同步方法。
  • 命名管道服务扩展类优化,移除同步启动方法。

更新详情:

TouchSocket.Core

  •   TouchSocket.Rpc.RpcAttribute 中的同步代码生成相关逻辑和注释代码,简化代码结构。
  •   RpcAttribute.GetPublicProperties 抽象方法,要求派生类实现属性获取逻辑。
  •   RpcAttribute.LoadPublicPropertiesAsDictionary 方法改为私有,优化属性加载逻辑。
  •   RpcAttribute.GetPublicPropertiesAsDictionary 方法上的RequiresUnreferencedCode特性。
  •   CodeGenerator 类移除注释代码,简化代码结构。

TouchSocket.WebApi

  •   WebApiOption 构造函数不再自动添加JSON序列化器,需要用户手动配置序列化器。
  •   WebApiSerializerConverter.AddJsonSerializerFormatter 方法(使用Newtonsoft.Json)。
  •   WebApiSerializerConverter 默认构造函数中添加System.Text.Json序列化器配置,清除默认解析器链以优化性能。
  •   WebApiSerializerConverter.Serialize 方法增加空值检查,避免不必要的序列化操作。
  •   WebApiClientWebApiClientSlim 使用 SystemTextJsonStringToClassSerializerFormatter 替代 JsonStringToClassSerializerFormatter
  •   WebApiAttribute.GetPublicProperties 方法实现,返回公共属性列表。
  •   WebApiJsonSerializerFormatter 改为继承自 SystemTextJsonStringToClassSerializerFormatter
  •   WebApiSystemTextJsonSerializerContext 增加常见类型的JSON序列化支持(bool、string、int、double、float、DateTime、DateTimeOffset、Version)。

TouchSocket.WebApi.Swagger

  •   Swagger组件所有OpenAPI相关类从Newtonsoft.Json迁移到System.Text.Json
    • OpenApiComponentOpenApiContentOpenApiInfoOpenApiParameter
    • OpenApiPathValueOpenApiPropertyOpenApiRequestBodyOpenApiResponse
    • OpenApiRootOpenApiSchema
  •   所有JSON特性从[JsonProperty]改为[JsonPropertyName]
  •   OpenApiStringEnumConverter 从继承Newtonsoft.Json.Converters.StringEnumConverter改为继承System.Text.Json.Serialization.JsonStringEnumConverter
  •   SwaggerPlugin.GetOpenApiJson 方法使用System.Text.Json.JsonSerializer进行序列化,配置使用JsonIgnoreCondition.WhenWritingNull和格式化输出。
  •   SwaggerPlugin.BuildHttpMethod 方法修复同一路径多个HTTP方法时的路由冲突问题。

TouchSocket.XmlRpc

  •   XmlRpcAttribute 中已废弃的构造函数(带参数版本)。
  •   XmlRpcAttribute.GetPublicProperties 方法实现,返回公共属性列表。

TouchSocket.Rpc

  •   RpcClientExtension.Invoke 同步方法(两个重载版本)。
  •   RpcClientExtension.InvokeT<T> 同步方法(两个重载版本,用于不同RPC客户端)。

TouchSocket

  •   ClientExtension.Close 同步方法(两个重载版本)。
  •   ClientExtension.SafeClose 同步方法(两个重载版本,已标记为Obsolete)。
  •   ClientExtension.Connect 同步方法(三个重载版本)。
  •   ClientExtension.TryConnect 同步方法(两个重载版本)。
  •   SenderExtension.Send 同步方法(多个重载版本,涵盖ISender、IRequestInfoSender、IIdSender、IUdpClientSender)。
  •   ServiceExtension.StartStop 同步方法(涵盖IServiceBase、ITcpService、IUdpSession)。
  •   WaitingClientExtension.SendThenResponse 同步方法(四个重载版本)。

TouchSocket.Modbus

  •   ModbusMasterExtension.SendModbusRequest 同步方法。
  •   ModbusMasterExtension.ReadWriteMultipleRegisters 同步方法(不带超时参数版本)。
  •   ModbusMasterExtension.ReadCoils 等读写方法的多个同步重载版本。
  •   ModbusMasterExtension 中所有标记为AsyncToSyncWarning的同步扩展方法。

TouchSocket.NamedPipe

  •   NamedPipeServiceExtension.Start 同步方法。

TouchSocketPro.PlcBridges

  •   IPlcOperatorExtension.Read 同步方法。

TouchSocket.TcpCommandLine

  •   TcpCommandLinePlugin 构造函数中使用 SystemTextJsonStringToClassSerializerFormatter 替代 JsonStringToClassSerializerFormatter

性能改进

  • System.Text.Json在大多数场景下比Newtonsoft.Json性能提升 20-50%
  • 异步方法强制使用避免了异步转同步的性能损耗
  • Swagger JSON生成性能提升约 30%
  • 减少内存分配,降低GC压力