Example #1
0
        /// <summary>
        /// Cancels any ongoing evaluations or interaction processing.
        /// </summary>
        public async Task CancelAllAsync(CancellationToken cancellationToken = default(CancellationToken)) {
            if (_runTask == null) {
                // Nothing to cancel.
                return;
            }

            await TaskUtilities.SwitchToBackgroundThread();

            var tcs = new TaskCompletionSource<object>();
            if (Interlocked.CompareExchange(ref _cancelAllTcs, tcs, null) != null) {
                // Cancellation is already in progress - do nothing.
                return;
            }

            using (tcs.RegisterForCancellation(_cts.Token))
            using (tcs.RegisterForCancellation(cancellationToken)) {
                try {
                    // Cancel any pending callbacks
                    _cancelAllCts.Cancel();
                    var cts = CancellationTokenSource.CreateLinkedTokenSource(_cts.Token, cancellationToken);
                    try {
                        await NotifyAsync("!//", cts.Token);
                    } catch (OperationCanceledException) {
                        return;
                    } catch (MessageTransportException) {
                        return;
                    } finally {
                        cts.Dispose();
                    }

                    await tcs.Task;
                } finally {
                    Volatile.Write(ref _cancelAllTcs, null);
                }
            }
        }
 public QueueItem(bool isAwaitable, CancellationToken cancellationToken)
 {
     _tcs        = new TaskCompletionSource <IDisposable>(TaskCreationOptions.RunContinuationsAsynchronously);
     IsAwaitable = isAwaitable;
     _tcs.RegisterForCancellation(cancellationToken).UnregisterOnCompletion(_tcs.Task);
 }
Example #3
0
 public static CancellationTokenRegistration RegisterForCancellation <T>(this TaskCompletionSource <T> taskCompletionSource, CancellationToken cancellationToken)
 => taskCompletionSource.RegisterForCancellation(-1, cancellationToken);
 public PrioritizerDisposable(CancellationToken cancellationToken)
 {
     _tcs = new TaskCompletionSource <int>();
     _tcs.RegisterForCancellation(cancellationToken).UnregisterOnCompletion(_tcs.Task);
 }
Example #5
0
 public QueueItem(bool isAwaitable, CancellationToken cancellationToken)
 {
     _tcs        = new TaskCompletionSource <IDisposable>();
     IsAwaitable = isAwaitable;
     _tcs.RegisterForCancellation(cancellationToken).UnregisterOnCompletion(_tcs.Task);
 }