Explorar o código

1.fix Dictionary tryInsert error
2. remove wait completed wait message response

Robert hai 7 meses
pai
achega
0e5bf7ba79

+ 6 - 3
EVCB_OCPP.WSServer/Service/ConfirmWaitingMessageSerevice.cs

@@ -15,6 +15,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using EVCB_OCPP.WSServer.Service.DbService;
+using System.Collections.Concurrent;
 
 namespace EVCB_OCPP.WSServer.Service
 {
@@ -72,7 +73,7 @@ namespace EVCB_OCPP.WSServer.Service
         private readonly IDbContextFactory<MainDBContext> maindbContextFactory;
         private readonly ILogger<ConfirmWaitingMessageSerevice> logger;
         private readonly List<NeedConfirmMessage> needConfirmPacketList = new();
-        private readonly Dictionary<string, MessageResultWaitObject> asyncWaitingTasks = new();
+        private readonly ConcurrentDictionary<string, MessageResultWaitObject> asyncWaitingTasks = new();
 
         internal async Task Add(string chargePointSerialNumber, int table_id, string requestId, string action, string msg_id, string createdBy, string sendMessage)
         {
@@ -237,7 +238,7 @@ namespace EVCB_OCPP.WSServer.Service
             if (waitObject == null)
             {
                 waitObject = new MessageResultWaitObject();
-                asyncWaitingTasks.Add(serialNo, waitObject);
+                asyncWaitingTasks.TryAdd(serialNo, waitObject);
             }
 
             var task = waitObject.Lock.WaitAsync(token);
@@ -254,13 +255,15 @@ namespace EVCB_OCPP.WSServer.Service
                 logger.LogWarning("{msg} not found in db", serialNo);
                 return null;
             }
+
+            asyncWaitingTasks.Remove(serialNo, out var _);
             return waitObject.Result.Message;
         }
 
         private MessageResultWaitObject CreateAndAddWaitObject(string serialNo)
         {
             var waiObj = new MessageResultWaitObject();
-            asyncWaitingTasks.Add(serialNo, waiObj);
+            asyncWaitingTasks.TryAdd(serialNo, waiObj);
             return waiObj;
         }