From 30d10d6e225d109af5b51148ccac167df426ccaf Mon Sep 17 00:00:00 2001
From: milimoe <110188673+milimoe@users.noreply.github.com>
Date: Sat, 27 Jul 2024 00:43:22 +0800
Subject: [PATCH] =?UTF-8?q?=E4=B8=BADataRequest=E6=B7=BB=E5=8A=A0RequestID?=
=?UTF-8?q?=E4=BB=A5=E9=98=B2=E6=AD=A2=E5=A4=9A=E7=BA=BF=E7=A8=8B=E6=97=B6?=
=?UTF-8?q?=E5=86=B2=E7=AA=81=EF=BC=9B=E4=BF=AE=E6=94=B9AsyncAwaiter?=
=?UTF-8?q?=E7=AD=89=E5=BE=85=E9=80=BB=E8=BE=91=20(#77)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Api/Transmittal/DataRequest.cs | 18 +++++++++-------
Api/Transmittal/WebDataRequest.cs | 7 +++---
Library/Common/Architecture/AsyncAwaiter.cs | 24 ++++++++++++++-------
3 files changed, 30 insertions(+), 19 deletions(-)
diff --git a/Api/Transmittal/DataRequest.cs b/Api/Transmittal/DataRequest.cs
index 74215ee..fc4788d 100644
--- a/Api/Transmittal/DataRequest.cs
+++ b/Api/Transmittal/DataRequest.cs
@@ -52,7 +52,7 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
///
internal DataRequest(Socket Socket, DataRequestType RequestType, bool IsLongRunning = false)
{
- Worker = new(Socket, RequestType, IsLongRunning);
+ Worker = new(Socket, RequestType, Guid.NewGuid(), IsLongRunning);
}
///
@@ -105,7 +105,7 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
return GetHashtableJsonObject(Worker.ResultData, key);
}
- private class SocketRequest(Socket? Socket, DataRequestType RequestType, bool IsLongRunning = false) : SocketHandlerController(Socket)
+ private class SocketRequest(Socket? Socket, DataRequestType RequestType, Guid RequestID, bool IsLongRunning = false) : SocketHandlerController(Socket)
{
public Hashtable RequestData { get; } = [];
public Hashtable ResultData => _ResultData;
@@ -114,6 +114,7 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
private readonly Socket? Socket = Socket;
private readonly DataRequestType RequestType = RequestType;
+ private readonly Guid RequestID = RequestID;
private readonly bool _IsLongRunning = IsLongRunning;
private Hashtable _ResultData = [];
private RequestResult _Result = RequestResult.Missing;
@@ -124,7 +125,7 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
try
{
SetWorking();
- if (Socket?.Send(SocketMessageType.DataRequest, RequestType, RequestData) == SocketResult.Success)
+ if (Socket?.Send(SocketMessageType.DataRequest, RequestType, RequestID, RequestData) == SocketResult.Success)
{
WaitForWorkDone();
}
@@ -143,7 +144,7 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
try
{
SetWorking();
- if (Socket?.Send(SocketMessageType.DataRequest, RequestType, RequestData) == SocketResult.Success)
+ if (Socket?.Send(SocketMessageType.DataRequest, RequestType, RequestID, RequestData) == SocketResult.Success)
{
await WaitForWorkDoneAsync();
}
@@ -163,13 +164,14 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
{
if (SocketObject.SocketType == SocketMessageType.DataRequest)
{
- Work = SocketObject;
- Working = false;
DataRequestType type = SocketObject.GetParam(0);
- if (type == RequestType)
+ Guid id = SocketObject.GetParam(1);
+ if (type == RequestType && id == RequestID)
{
if (!_IsLongRunning) Dispose();
- _ResultData = SocketObject.GetParam(1) ?? [];
+ Work = SocketObject;
+ Working = false;
+ _ResultData = SocketObject.GetParam(2) ?? [];
_Result = RequestResult.Success;
}
}
diff --git a/Api/Transmittal/WebDataRequest.cs b/Api/Transmittal/WebDataRequest.cs
index 7d428ca..f1906db 100644
--- a/Api/Transmittal/WebDataRequest.cs
+++ b/Api/Transmittal/WebDataRequest.cs
@@ -45,7 +45,7 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
///
internal WebDataRequest(HTTPClient Socket, DataRequestType RequestType)
{
- Worker = new(Socket, RequestType);
+ Worker = new(Socket, RequestType, Guid.NewGuid());
}
///
@@ -90,7 +90,7 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
return GetHashtableJsonObject(Worker.ResultData, key);
}
- private class WebSocketRequest(HTTPClient? Socket, DataRequestType RequestType)
+ private class WebSocketRequest(HTTPClient? Socket, DataRequestType RequestType, Guid RequestID)
{
public Hashtable RequestData { get; } = [];
public Hashtable ResultData => _ResultData;
@@ -99,6 +99,7 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
private readonly HTTPClient? Socket = Socket;
private readonly DataRequestType RequestType = RequestType;
+ private readonly Guid RequestID = RequestID;
private readonly Hashtable _ResultData = [];
private RequestResult _Result = RequestResult.Missing;
private string _Error = "";
@@ -109,7 +110,7 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
{
if (Socket != null)
{
- await Socket.Send(SocketMessageType.DataRequest, RequestType, RequestData);
+ await Socket.Send(SocketMessageType.DataRequest, RequestType, RequestID, RequestData);
}
else throw new ConnectFailedException();
}
diff --git a/Library/Common/Architecture/AsyncAwaiter.cs b/Library/Common/Architecture/AsyncAwaiter.cs
index a05b0a5..b5987ff 100644
--- a/Library/Common/Architecture/AsyncAwaiter.cs
+++ b/Library/Common/Architecture/AsyncAwaiter.cs
@@ -30,10 +30,16 @@
///
protected virtual void WaitForWorkDone()
{
+ for (int i = 0; i < 10; i++)
+ {
+ if (!Working) break;
+ Thread.Sleep(50);
+ }
+
while (true)
{
if (!Working) break;
- Thread.Sleep(100);
+ Thread.Sleep(20);
}
}
@@ -42,14 +48,16 @@
///
protected async virtual Task WaitForWorkDoneAsync()
{
- await Task.Factory.StartNew(() =>
+ for (int i = 0; i < 10; i++)
{
- while (true)
- {
- if (!Working) break;
- Thread.Sleep(100);
- }
- });
+ if (!Working) break;
+ await Task.Delay(50);
+ }
+
+ while (Working)
+ {
+ await Task.Delay(20);
+ }
}
}
}