wanshenmean
3 天以前 b690250002ee04f4309e6a90fd16fbfd9bd959e2
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotStateManager.cs
@@ -1,3 +1,4 @@
using System.Collections.Concurrent;
using Newtonsoft.Json;
using Serilog;
using WIDESEAWCS_ITaskInfoRepository;
@@ -11,6 +12,7 @@
    /// <remarks>
    /// 核心功能是通过 IRobotStateRepository 管理数据库中的机械手状态。
    /// 提供乐观并发控制,通过 Version 字段防止并发更新时的数据覆盖问题。
    /// 同时提供基于 SemaphoreSlim 的互斥锁,确保消息处理与 Job 执行不会并发操作同一设备状态。
    /// </remarks>
    public class RobotStateManager
    {
@@ -25,6 +27,15 @@
        private readonly ILogger _logger;
        /// <summary>
        /// 每个设备的异步互斥锁字典,用于 Job 执行与消息处理之间的互斥
        /// </summary>
        /// <remarks>
        /// Key 为设备 IP 地址,Value 为该设备专属的 SemaphoreSlim(1,1)。
        /// 确保同一设备的 Job 轮询和 TCP 消息处理不会同时操作状态。
        /// </remarks>
        private readonly ConcurrentDictionary<string, SemaphoreSlim> _robotLocks = new();
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="repository">仓储服务实例</param>
@@ -36,6 +47,20 @@
        }
        /// <summary>
        /// 获取或创建指定设备的异步互斥锁
        /// </summary>
        /// <remarks>
        /// 使用 ConcurrentDictionary 确保每个设备 IP 对应唯一的 SemaphoreSlim(1,1)。
        /// 该锁用于 Job 执行与 TCP 消息处理之间的互斥,防止并发操作同一设备状态。
        /// </remarks>
        /// <param name="ipAddress">设备 IP 地址</param>
        /// <returns>该设备的信号量实例</returns>
        public SemaphoreSlim GetOrCreateLock(string ipAddress)
        {
            return _robotLocks.GetOrAdd(ipAddress, _ => new SemaphoreSlim(1, 1));
        }
        /// <summary>
        /// 安全更新 RobotSocketState,防止并发覆盖
        /// </summary>
        /// <remarks>