为DataRequest添加RequestID以防止多线程时冲突;修改AsyncAwaiter等待逻辑 (#77)

This commit is contained in:
milimoe 2024-07-27 00:43:22 +08:00 committed by GitHub
parent a155aeb028
commit 30d10d6e22
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 30 additions and 19 deletions

View File

@ -52,7 +52,7 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
/// <param name="IsLongRunning"></param>
internal DataRequest(Socket Socket, DataRequestType RequestType, bool IsLongRunning = false)
{
Worker = new(Socket, RequestType, IsLongRunning);
Worker = new(Socket, RequestType, Guid.NewGuid(), IsLongRunning);
}
/// <summary>
@ -105,7 +105,7 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
return GetHashtableJsonObject<T>(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<DataRequestType>(0);
if (type == RequestType)
Guid id = SocketObject.GetParam<Guid>(1);
if (type == RequestType && id == RequestID)
{
if (!_IsLongRunning) Dispose();
_ResultData = SocketObject.GetParam<Hashtable>(1) ?? [];
Work = SocketObject;
Working = false;
_ResultData = SocketObject.GetParam<Hashtable>(2) ?? [];
_Result = RequestResult.Success;
}
}

View File

@ -45,7 +45,7 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
/// <param name="RequestType"></param>
internal WebDataRequest(HTTPClient Socket, DataRequestType RequestType)
{
Worker = new(Socket, RequestType);
Worker = new(Socket, RequestType, Guid.NewGuid());
}
/// <summary>
@ -90,7 +90,7 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
return GetHashtableJsonObject<T>(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();
}

View File

@ -30,10 +30,16 @@
/// </summary>
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 @@
/// </summary>
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);
}
}
}
}