async ValueTask <OperationState <RecognizedFormCollection> > IOperation <RecognizedFormCollection> .UpdateStateAsync(bool async, CancellationToken cancellationToken) { Response <AnalyzeOperationResult> response = async ? await _serviceClient.GetAnalyzeReceiptResultAsync(new Guid(Id), cancellationToken).ConfigureAwait(false) : _serviceClient.GetAnalyzeReceiptResult(new Guid(Id), cancellationToken); OperationStatus status = response.Value.Status; Response rawResponse = response.GetRawResponse(); if (status == OperationStatus.Succeeded) { return(OperationState <RecognizedFormCollection> .Success(rawResponse, ClientCommon.ConvertPrebuiltOutputToRecognizedForms(response.Value.AnalyzeResult))); } else if (status == OperationStatus.Failed) { RequestFailedException requestFailedException = await ClientCommon .CreateExceptionForFailedOperationAsync(async, _diagnostics, rawResponse, response.Value.AnalyzeResult.Errors) .ConfigureAwait(false); return(OperationState <RecognizedFormCollection> .Failure(rawResponse, requestFailedException)); } return(OperationState <RecognizedFormCollection> .Pending(rawResponse)); }
/// <summary> /// Calls the server to get updated status of the long-running operation. /// </summary> /// <param name="async">When <c>true</c>, the method will be executed asynchronously; otherwise, it will execute synchronously.</param> /// <param name="cancellationToken">A <see cref="CancellationToken"/> used for the service call.</param> /// <returns>The HTTP response received from the server.</returns> private async ValueTask <Response> UpdateStatusAsync(bool async, CancellationToken cancellationToken) { if (!_hasCompleted) { using DiagnosticScope scope = _diagnostics.CreateScope($"{nameof(RecognizeReceiptsOperation)}.{nameof(UpdateStatus)}"); scope.Start(); try { Response <AnalyzeOperationResult> update = async ? await _serviceClient.GetAnalyzeReceiptResultAsync(new Guid(Id), cancellationToken).ConfigureAwait(false) : _serviceClient.GetAnalyzeReceiptResult(new Guid(Id), cancellationToken); _response = update.GetRawResponse(); if (update.Value.Status == OperationStatus.Succeeded) { // We need to first assign a value and then mark the operation as completed to avoid a race condition with the getter in Value _value = ConvertToRecognizedForms(update.Value.AnalyzeResult); _hasCompleted = true; } else if (update.Value.Status == OperationStatus.Failed) { _requestFailedException = await ClientCommon .CreateExceptionForFailedOperationAsync(async, _diagnostics, _response, update.Value.AnalyzeResult.Errors) .ConfigureAwait(false); _hasCompleted = true; throw _requestFailedException; } } catch (Exception e) { scope.Failed(e); throw; } } return(GetRawResponse()); }