diff --git a/Example.Frontend/Example.Frontend.csproj b/Example.Frontend/Example.Frontend.csproj index e4d8f0d..35760b9 100644 --- a/Example.Frontend/Example.Frontend.csproj +++ b/Example.Frontend/Example.Frontend.csproj @@ -2,7 +2,7 @@ Exe - netstandard2.1 + net9.0 enable diff --git a/Example.Shared/Example.Shared.csproj b/Example.Shared/Example.Shared.csproj index 37ad63a..3d97856 100644 --- a/Example.Shared/Example.Shared.csproj +++ b/Example.Shared/Example.Shared.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net9.0 enable diff --git a/mROA/Abstract/ISerialisationModule.cs b/mROA/Abstract/ISerialisationModule.cs index 02292c2..a25e00e 100644 --- a/mROA/Abstract/ISerialisationModule.cs +++ b/mROA/Abstract/ISerialisationModule.cs @@ -1,5 +1,7 @@ using System; +using System.Threading; using System.Threading.Tasks; +using System.Windows.Input; using mROA.Implementation; using mROA.Implementation.CommandExecution; @@ -22,9 +24,9 @@ namespace mROA.Abstract public interface IRepresentationModule : IInjectableModule { int Id { get; } - Task GetMessageAsync(Guid? requestId = null, MessageType? messageType = null); + Task GetMessageAsync(Guid? requestId = null, MessageType? messageType = null, CancellationToken token = default); T GetMessage(Guid? requestId = null, MessageType? messageType = null); - Task GetRawMessage(Guid? requestId = null, MessageType? messageType = null); + Task GetRawMessage(Guid? requestId = null, MessageType? messageType = null, CancellationToken token = default); Task PostCallMessageAsync(Guid id, MessageType messageType, T payload) where T : notnull; Task PostCallMessageAsync(Guid id, MessageType messageType, object payload, Type payloadType); diff --git a/mROA/Implementation/Frontend/RequestExtractor.cs b/mROA/Implementation/Frontend/RequestExtractor.cs index 5cfb0b6..7716314 100644 --- a/mROA/Implementation/Frontend/RequestExtractor.cs +++ b/mROA/Implementation/Frontend/RequestExtractor.cs @@ -85,7 +85,7 @@ namespace mROA.Implementation.Frontend } catch { - multiClientOwnershipRepository?.RegisterOwnership(_representationModule.Id); + multiClientOwnershipRepository?.FreeOwnership(); } } } diff --git a/mROA/Implementation/NextGenerationInteractionModule.cs b/mROA/Implementation/NextGenerationInteractionModule.cs index 0f3f253..72402b9 100644 --- a/mROA/Implementation/NextGenerationInteractionModule.cs +++ b/mROA/Implementation/NextGenerationInteractionModule.cs @@ -34,7 +34,7 @@ namespace mROA.Implementation public Task GetNextMessageReceiving() { if (_currentReceiving != null) return _currentReceiving; - _currentReceiving = Task.Run(GetNextMessage); + _currentReceiving = Task.Run(async () => await GetNextMessage()); return _currentReceiving; } @@ -87,7 +87,7 @@ namespace mROA.Implementation var message = _serialization.Deserialize(localSpan.Span); _messageBuffer.Add(message!); - _currentReceiving = GetNextMessage(); + _currentReceiving = Task.Run(async () => await GetNextMessage()); return message!; } diff --git a/mROA/Implementation/RemoteObjectBase.cs b/mROA/Implementation/RemoteObjectBase.cs index 69e2657..2da6cbe 100644 --- a/mROA/Implementation/RemoteObjectBase.cs +++ b/mROA/Implementation/RemoteObjectBase.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System.Threading; +using System.Threading.Tasks; using mROA.Abstract; using mROA.Implementation.CommandExecution; @@ -26,16 +27,22 @@ namespace mROA.Implementation { CommandId = methodId, ObjectId = _id, Parameter = parameter, ParameterType = parameter?.GetType() }; await _representationModule.PostCallMessageAsync(request.Id, MessageType.CallRequest, request); + var localTokenSource = new CancellationTokenSource(); + var successResponse = - _representationModule.GetMessageAsync>( - messageType: MessageType.FinishedCommandExecution, requestId: request.Id); + _representationModule.GetMessageAsync>(request.Id, + MessageType.FinishedCommandExecution, + localTokenSource.Token); var errorResponse = - _representationModule.GetMessageAsync( - messageType: MessageType.ExceptionCommandExecution, requestId: request.Id); + _representationModule.GetMessageAsync(requestId: request.Id, + MessageType.ExceptionCommandExecution, localTokenSource.Token); + Task.WaitAny(successResponse, errorResponse); if (successResponse.IsCompletedSuccessfully) + { return successResponse.Result.Result!; + } throw errorResponse.Result.GetException(); } diff --git a/mROA/Implementation/RepresentationModule.cs b/mROA/Implementation/RepresentationModule.cs index b6e0ce7..dcba18f 100644 --- a/mROA/Implementation/RepresentationModule.cs +++ b/mROA/Implementation/RepresentationModule.cs @@ -1,4 +1,5 @@ using System; +using System.Threading; using System.Threading.Tasks; using mROA.Abstract; @@ -24,12 +25,12 @@ namespace mROA.Implementation public int Id => (_interaction ?? throw new NullReferenceException("Interaction is not initialized")).ConnectionId; - public async Task GetMessageAsync(Guid? requestId, MessageType? messageType) + public async Task GetMessageAsync(Guid? requestId, MessageType? messageType, CancellationToken token = default) { if (_serialization == null) throw new NullReferenceException("Serialization toolkit is not initialized"); - return _serialization.Deserialize(await GetRawMessage(requestId, messageType))!; + return _serialization.Deserialize(await GetRawMessage(requestId, messageType, token))!; } public T GetMessage(Guid? requestId = null, MessageType? messageType = null) @@ -40,7 +41,7 @@ namespace mROA.Implementation return _serialization.Deserialize(GetRawMessage(requestId, messageType).GetAwaiter().GetResult())!; } - public async Task GetRawMessage(Guid? requestId = null, MessageType? messageType = null) + public async Task GetRawMessage(Guid? requestId = null, MessageType? messageType = null, CancellationToken token = default) { if (_interaction == null) throw new NullReferenceException("Interaction toolkit is not initialized"); @@ -52,7 +53,7 @@ namespace mROA.Implementation if (fromBuffer == null) { - while (true) + while (token.IsCancellationRequested == false) { var message = await _interaction.GetNextMessageReceiving(); if ((requestId is not null && message.Id != requestId) ||