Подготовка перехода на EventWaitHandle
This commit is contained in:
@@ -6,9 +6,12 @@ public interface INextGenerationInteractionModule : IInjectableModule
|
|||||||
{
|
{
|
||||||
int ConnectionId { get; }
|
int ConnectionId { get; }
|
||||||
public Stream? BaseStream { get; set; }
|
public Stream? BaseStream { get; set; }
|
||||||
|
NetworkMessage[] UnhandledMessages { get; }
|
||||||
|
NetworkMessage LastMessage { get; }
|
||||||
|
EventWaitHandle CurrentReceivingHandle { get; }
|
||||||
|
void StartInfiniteReceiving();
|
||||||
Task<NetworkMessage> GetNextMessageReceiving();
|
Task<NetworkMessage> GetNextMessageReceiving();
|
||||||
Task PostMessage(NetworkMessage message);
|
Task PostMessage(NetworkMessage message);
|
||||||
void HandleMessage(NetworkMessage message);
|
void HandleMessage(NetworkMessage message);
|
||||||
NetworkMessage[] UnhandledMessages { get; }
|
|
||||||
NetworkMessage? FirstByFilter(Predicate<NetworkMessage> predicate);
|
NetworkMessage? FirstByFilter(Predicate<NetworkMessage> predicate);
|
||||||
}
|
}
|
||||||
@@ -5,6 +5,7 @@ namespace mROA.Implementation;
|
|||||||
|
|
||||||
public class NetworkMessage
|
public class NetworkMessage
|
||||||
{
|
{
|
||||||
|
public static readonly NetworkMessage Null = new() {SchemaId = MessageType.Unknown, Id = Guid.Empty, Data = []};
|
||||||
public Guid Id { get; init; }
|
public Guid Id { get; init; }
|
||||||
[JsonConverter(typeof(JsonStringEnumConverter))]
|
[JsonConverter(typeof(JsonStringEnumConverter))]
|
||||||
public MessageType SchemaId { get; init; }
|
public MessageType SchemaId { get; init; }
|
||||||
|
|||||||
@@ -11,7 +11,9 @@ public class NextGenerationInteractionModule : INextGenerationInteractionModule
|
|||||||
private const int BufferSize = ushort.MaxValue;
|
private const int BufferSize = ushort.MaxValue;
|
||||||
private readonly Memory<byte> _buffer = new byte[BufferSize];
|
private readonly Memory<byte> _buffer = new byte[BufferSize];
|
||||||
private readonly List<NetworkMessage> _messageBuffer = new (128);
|
private readonly List<NetworkMessage> _messageBuffer = new (128);
|
||||||
|
public NetworkMessage[] UnhandledMessages => _messageBuffer.ToArray();
|
||||||
|
public NetworkMessage LastMessage { get; private set; } = NetworkMessage.Null;
|
||||||
|
public EventWaitHandle CurrentReceivingHandle { get; private set; } = new(false, EventResetMode.ManualReset);
|
||||||
|
|
||||||
public void Inject<T>(T dependency)
|
public void Inject<T>(T dependency)
|
||||||
{
|
{
|
||||||
@@ -27,6 +29,19 @@ public class NextGenerationInteractionModule : INextGenerationInteractionModule
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public async void StartInfiniteReceiving()
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
var message = ReceiveMessage();
|
||||||
|
LastMessage = message;
|
||||||
|
CurrentReceivingHandle.Set();
|
||||||
|
CurrentReceivingHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public Task<NetworkMessage> GetNextMessageReceiving()
|
public Task<NetworkMessage> GetNextMessageReceiving()
|
||||||
{
|
{
|
||||||
if (_currentReceiving != null) return _currentReceiving;
|
if (_currentReceiving != null) return _currentReceiving;
|
||||||
@@ -56,7 +71,6 @@ public class NextGenerationInteractionModule : INextGenerationInteractionModule
|
|||||||
_messageBuffer.Remove(message);
|
_messageBuffer.Remove(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public NetworkMessage[] UnhandledMessages => _messageBuffer.ToArray();
|
|
||||||
public NetworkMessage? FirstByFilter(Predicate<NetworkMessage> predicate)
|
public NetworkMessage? FirstByFilter(Predicate<NetworkMessage> predicate)
|
||||||
{
|
{
|
||||||
return _messageBuffer.FirstOrDefault(m => predicate(m));
|
return _messageBuffer.FirstOrDefault(m => predicate(m));
|
||||||
@@ -71,17 +85,21 @@ public class NextGenerationInteractionModule : INextGenerationInteractionModule
|
|||||||
throw new NullReferenceException("Serialization toolkit is null");
|
throw new NullReferenceException("Serialization toolkit is null");
|
||||||
|
|
||||||
|
|
||||||
// Console.WriteLine("Receiving message");
|
var message = ReceiveMessage();
|
||||||
var len = BitConverter.ToUInt16([(byte)BaseStream.ReadByte(), (byte)BaseStream.ReadByte()]);
|
|
||||||
var localSpan = _buffer.Span.Slice(0, len);
|
_messageBuffer.Add(message);
|
||||||
BaseStream.ReadExactly(localSpan);
|
|
||||||
|
|
||||||
// Console.WriteLine("Receiving {0}", Encoding.Default.GetString(_buffer[..len]));
|
|
||||||
|
|
||||||
var message = _serialization.Deserialize<NetworkMessage>(localSpan);
|
|
||||||
_messageBuffer.Add(message!);
|
|
||||||
_currentReceiving = Task.Run(GetNextMessage);
|
_currentReceiving = Task.Run(GetNextMessage);
|
||||||
|
|
||||||
return message!;
|
return message!;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private NetworkMessage ReceiveMessage()
|
||||||
|
{
|
||||||
|
var len = BitConverter.ToUInt16([(byte)BaseStream!.ReadByte(), (byte)BaseStream.ReadByte()]);
|
||||||
|
var localSpan = _buffer.Span.Slice(0, len);
|
||||||
|
BaseStream.ReadExactly(localSpan);
|
||||||
|
|
||||||
|
var message = _serialization!.Deserialize<NetworkMessage>(localSpan);
|
||||||
|
return message!;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user