Skip to content

Instantly share code, notes, and snippets.

@icanhasjonas
Last active June 7, 2017 19:05
Show Gist options
  • Save icanhasjonas/bdacabee5898f3ec91603945847a2e22 to your computer and use it in GitHub Desktop.
Save icanhasjonas/bdacabee5898f3ec91603945847a2e22 to your computer and use it in GitHub Desktop.
Awaitable Cancellation Tokens
public static class AwaitableCancellationTokenExtensions
{
public struct CancellationTokenAwaiter : ICriticalNotifyCompletion, INotifyCompletion
{
private readonly CancellationToken _cancellationToken;
public CancellationTokenAwaiter(CancellationToken cancellationToken)
{
_cancellationToken = cancellationToken;
}
public void OnCompleted(Action continuation) => _cancellationToken.Register(continuation, false);
public void UnsafeOnCompleted(Action continuation) => OnCompleted(continuation);
public bool IsCompleted => _cancellationToken.IsCancellationRequested;
public void GetResult() { }
}
public static CancellationTokenAwaiter GetAwaiter(this CancellationToken c) => new CancellationTokenAwaiter(c);
}
@icanhasjonas
Copy link
Author

Enables awaiting CancellationToken

public async Task SomeMethod( string someArgument, CancellationToken cancellationToken ) {
  // ... 
  await cancellationToken;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment