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