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);
+ }
}
}
}