фронтенд для отмены задач
This commit is contained in:
@@ -15,6 +15,6 @@ namespace mROA.Implementation
|
||||
|
||||
public enum MessageType
|
||||
{
|
||||
Unknown, FinishedCommandExecution, ExceptionCommandExecution, AsyncCancelCommandExecution, CallRequest, IdAssigning
|
||||
Unknown, FinishedCommandExecution, ExceptionCommandExecution, AsyncCancelCommandExecution, CallRequest, IdAssigning, CancelRequest
|
||||
}
|
||||
}
|
||||
@@ -20,8 +20,9 @@ namespace mROA.Implementation
|
||||
|
||||
public int Id => _id;
|
||||
public int OwnerId => _representationModule.Id;
|
||||
|
||||
protected async Task<T> GetResultAsync<T>(int methodId, object? parameter = default)
|
||||
|
||||
protected async Task<T> GetResultAsync<T>(int methodId, object? parameter = default,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
var request = new DefaultCallRequest
|
||||
{ CommandId = methodId, ObjectId = _id, Parameter = parameter, ParameterType = parameter?.GetType() };
|
||||
@@ -37,30 +38,54 @@ namespace mROA.Implementation
|
||||
_representationModule.GetMessageAsync<ExceptionCommandExecution>(requestId: request.Id,
|
||||
MessageType.ExceptionCommandExecution, localTokenSource.Token);
|
||||
|
||||
Task.WaitAny(successResponse, errorResponse);
|
||||
Task.WaitAny(new Task[]
|
||||
{
|
||||
successResponse, errorResponse
|
||||
}, cancellationToken);
|
||||
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
await _representationModule.PostCallMessageAsync(request.Id, MessageType.CancelRequest, request.Id);
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
}
|
||||
|
||||
if (successResponse.IsCompletedSuccessfully)
|
||||
{
|
||||
localTokenSource.Cancel();
|
||||
return successResponse.Result.Result!;
|
||||
}
|
||||
|
||||
localTokenSource.Cancel();
|
||||
throw errorResponse.Result.GetException();
|
||||
}
|
||||
|
||||
protected async Task CallAsync(int methodId, object? parameter = default)
|
||||
protected async Task CallAsync(int methodId, object? parameter = default,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
var request = new DefaultCallRequest
|
||||
{ CommandId = methodId, ObjectId = _id, Parameter = parameter, ParameterType = parameter?.GetType() };
|
||||
await _representationModule.PostCallMessageAsync(request.Id, MessageType.CallRequest, request);
|
||||
|
||||
var successResponse =
|
||||
_representationModule.GetMessageAsync<FinalCommandExecution>(
|
||||
messageType: MessageType.FinishedCommandExecution, requestId: request.Id);
|
||||
var errorResponse =
|
||||
_representationModule.GetMessageAsync<ExceptionCommandExecution>(
|
||||
messageType: MessageType.ExceptionCommandExecution, requestId: request.Id);
|
||||
var localTokenSource = new CancellationTokenSource();
|
||||
|
||||
Task.WaitAny(successResponse, errorResponse);
|
||||
var successResponse =
|
||||
_representationModule.GetMessageAsync<FinalCommandExecution>(request.Id,
|
||||
MessageType.FinishedCommandExecution,
|
||||
localTokenSource.Token);
|
||||
var errorResponse =
|
||||
_representationModule.GetMessageAsync<ExceptionCommandExecution>(requestId: request.Id,
|
||||
MessageType.ExceptionCommandExecution, localTokenSource.Token);
|
||||
|
||||
Task.WaitAny(new Task[]
|
||||
{
|
||||
successResponse, errorResponse
|
||||
}, cancellationToken);
|
||||
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
await _representationModule.PostCallMessageAsync(request.Id, MessageType.CancelRequest, request.Id);
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
}
|
||||
|
||||
if (successResponse.IsCompletedSuccessfully)
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user