public Task WaitAsync(CancellationToken cancellationToken = default(CancellationToken)) {
if (!cancellationToken.CanBeCanceled) {
return _tcs.Task;
}
if (cancellationToken.IsCancellationRequested) {
return Task.FromCanceled(cancellationToken);
}
var tcs = new TaskCompletionSource<bool>();
cancellationToken.Register(CancelTcs, tcs);
_tcs.Task.ContinueWith(WaitContinuation, tcs, TaskContinuationOptions.ExecuteSynchronously);
return tcs.Task;
}