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);
}
}
}