With the following code you can create a CancellationTokenSource that will signal cancellation on dispose. This provides an alternative to having to wrap a normal CancellationTokenSource in a try finally block.
Code
public class AutoCancellationTokenSource : CancellationTokenSource
{
private bool _isDisposed;
public AutoCancellationTokenSource()
{
}
public AutoCancellationTokenSource(params CancellationToken[] linkedTokens)
{
foreach (var linkedToken in linkedTokens)
if (linkedToken.IsCancellationRequested)
TryCancel();
else
linkedToken.Register(TryCancel, false);
}
protected override void Dispose(bool disposing)
{
if (_isDisposed)
return;
TryCancel();
base.Dispose(disposing);
_isDisposed = true;
}
private void TryCancel()
{
if (!_isDisposed && !IsCancellationRequested)
Cancel();
}
}