private async Task SubmitResponseAsync(RequestContents <TRequest> requestContents, TResponse response, CancellationToken cancellationToken) { var responseQueue = cloudQueueClient.GetQueueReference(requestContents.ResponseQueueName); var responseContents = new ResponseContents <TResponse> { RequestId = requestContents.RequestId, Response = response }; var responseJson = JsonConvert.SerializeObject(responseContents); var responseMessage = new CloudQueueMessage(responseJson); await responseQueue.AddMessageAsync(responseMessage, cancellationToken); }
/// <summary> /// Submits a request for the workers to process /// </summary> public async Task <TResponse> SubmitRequestAsync(TRequest request, TimeSpan requestTimeout) { var requestContents = new RequestContents <TRequest> { RequestId = Guid.NewGuid(), ResponseQueueName = responseQueueName, Request = request }; var jsonContents = JsonConvert.SerializeObject(requestContents); var cloudMessage = new CloudQueueMessage(jsonContents); await requestQueue.AddMessageAsync(cloudMessage); Task <TResponse> responseTask = responseRetriever.SubmitRequest(requestContents, requestTimeout); return(await responseTask); }
public Task <TResponse> SubmitRequest(RequestContents <TRequest> requestContents, TimeSpan timeout) { if (requestContents == null) { throw new ArgumentNullException("requestContents"); } var completionSource = new TaskCompletionSource <TResponse>(); completionSources[requestContents.RequestId] = new TimeoutAndCompletionSource { TimeoutDateTimeOffset = DateTimeOffset.UtcNow + timeout, TaskCompletionSource = completionSource }; GuaranteeRetrievalTaskRunning(); return(completionSource.Task); }