|
@@ -210,23 +210,29 @@ namespace EVCB_OCPP.WSServer.Service
|
|
|
return message;
|
|
|
}
|
|
|
|
|
|
- internal async Task<object> WaitResultAsync(string serialNo, int maxWaitSec = 65000, CancellationToken token = default)
|
|
|
+ internal async Task<object> SendAndWaitUntilResultAsync(Func<string, Task> startSendTaskFunc, CancellationToken token = default)
|
|
|
{
|
|
|
- //if (!needConfirmPacketList.Select(x => x.RequestId).Contains(serialNo))
|
|
|
- //{
|
|
|
- // logger.LogWarning("msg {msg} not in wait list", serialNo);
|
|
|
- // var checkResult = await mainDbService.TryGetResponseFromDb(serialNo, token);
|
|
|
- // if (checkResult is not null)
|
|
|
- // {
|
|
|
- // logger.LogWarning("{msg} found in db", serialNo);
|
|
|
- // return checkResult;
|
|
|
- // }
|
|
|
- // logger.LogWarning("{msg} not found in db", serialNo);
|
|
|
- //}
|
|
|
+ object message;
|
|
|
+ do
|
|
|
+ {
|
|
|
+ var SerialNo = Guid.NewGuid().ToString();
|
|
|
+ var waitObject = CreateAndAddWaitObject(SerialNo);
|
|
|
+ await startSendTaskFunc(SerialNo);
|
|
|
+ message = await WaitResultAsync(SerialNo, waitObject: waitObject, token: token);
|
|
|
+ }
|
|
|
+ while (message == null && !token.IsCancellationRequested);
|
|
|
+ return message;
|
|
|
+ }
|
|
|
|
|
|
- var waiObj = new MessageResultWaitObject();
|
|
|
- asyncWaitingTasks.Add(serialNo, waiObj);
|
|
|
- var task = waiObj.Lock.WaitAsync(token);
|
|
|
+ internal async Task<object> WaitResultAsync(string serialNo, MessageResultWaitObject waitObject = null, int maxWaitSec = 65000, CancellationToken token = default)
|
|
|
+ {
|
|
|
+ if (waitObject == null)
|
|
|
+ {
|
|
|
+ waitObject = new MessageResultWaitObject();
|
|
|
+ asyncWaitingTasks.Add(serialNo, waitObject);
|
|
|
+ }
|
|
|
+
|
|
|
+ var task = waitObject.Lock.WaitAsync(token);
|
|
|
var completedTask = await Task.WhenAny(task, Task.Delay(180_000, token));
|
|
|
if (completedTask != task)
|
|
|
{
|
|
@@ -240,7 +246,14 @@ namespace EVCB_OCPP.WSServer.Service
|
|
|
logger.LogWarning("{msg} not found in db", serialNo);
|
|
|
return null;
|
|
|
}
|
|
|
- return waiObj.Result.Message;
|
|
|
+ return waitObject.Result.Message;
|
|
|
+ }
|
|
|
+
|
|
|
+ private MessageResultWaitObject CreateAndAddWaitObject(string serialNo)
|
|
|
+ {
|
|
|
+ var waiObj = new MessageResultWaitObject();
|
|
|
+ asyncWaitingTasks.Add(serialNo, waiObj);
|
|
|
+ return waiObj;
|
|
|
}
|
|
|
|
|
|
private void RemoveWaitingMsg(
|