示例#1
0
        public async Task Should_cancel_when_cancellation_attached()
        {
            var cts = new CancellationTokenSource();
            var tcs = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously);

            tcs.AttachCancellation(cts.Token);
            cts.Cancel();
            await Assert.ThrowsAnyAsync <OperationCanceledException>(() => tcs.Task);
        }
 public async Task WaitAsync(CancellationToken cancellationToken)
 {
     try
     {
         confirmationTcs.AttachCancellation(cancellationToken);
         await confirmationTcs.Task.ConfigureAwait(false);
     }
     finally
     {
         cleanup();
     }
 }
示例#3
0
        /// <summary>
        ///     Takes the element from queue
        /// </summary>
        /// <param name="cancellationToken">The cancellation token</param>
        /// <returns>The dequeued element</returns>
        public Task <T> DequeueAsync(CancellationToken cancellationToken = default)
        {
            lock (mutex)
            {
                if (elements.Count > 0)
                {
                    return(Task.FromResult(elements.Dequeue()));
                }

                CleanUpCancelledWaiters();

                var waiter = new TaskCompletionSource <T>(TaskCreationOptions.RunContinuationsAsynchronously);
                waiter.AttachCancellation(cancellationToken);
                waiters.Enqueue(waiter);
                return(waiter.Task);
            }
        }
示例#4
0
        /// <inheritdoc />
        public virtual async Task <TResponse> RequestAsync <TRequest, TResponse>(
            TRequest request,
            Action <IRequestConfiguration> configure,
            CancellationToken cancellationToken = default
            )
        {
            Preconditions.CheckNotNull(request, "request");

            var requestType          = typeof(TRequest);
            var requestConfiguration = new RequestConfiguration(
                conventions.RpcRoutingKeyNamingConvention(requestType),
                configuration.Timeout
                );

            configure(requestConfiguration);

            using var cts = cancellationToken.WithTimeout(requestConfiguration.Expiration);

            var correlationId = correlationIdGenerationStrategy.GetCorrelationId();
            var tcs           = new TaskCompletionSource <TResponse>(TaskCreationOptions.RunContinuationsAsynchronously);

            RegisterResponseActions(correlationId, tcs);
            using var callback = DisposableAction.Create(DeRegisterResponseActions, correlationId);

            var queueName = await SubscribeToResponseAsync <TRequest, TResponse>(cts.Token).ConfigureAwait(false);

            var routingKey = requestConfiguration.QueueName;
            var expiration = requestConfiguration.Expiration;
            var priority   = requestConfiguration.Priority;

            await RequestPublishAsync(
                request, routingKey, queueName, correlationId, expiration, priority, configuration.MandatoryPublish, cts.Token
                ).ConfigureAwait(false);

            tcs.AttachCancellation(cts.Token);
            return(await tcs.Task.ConfigureAwait(false));
        }