public Task<IDisposable> LockAsync()
{
var wait = _semaphore.WaitAsync();
if (wait.IsCompleted)
{
return _releaser;
}
else
{
return wait.ContinueWith(
(_, state) => (IDisposable)state,
_releaser.Result,
CancellationToken.None,
TaskContinuationOptions.ExecuteSynchronously,
TaskScheduler.Default
);
}
}