internal static async Task <bool> WaitOneAsync(
this WaitHandle handle, int millisecondsTimeout, CancellationToken cancellationToken = default)
{
var tcs = new TaskCompletionSource <bool>();
using var tokenRegistration =
cancellationToken.Register(state => ((TaskCompletionSource <bool>)state !).TrySetCanceled(), tcs);
RegisteredWaitHandle?registeredHandle = null;
try
{
registeredHandle = ThreadPool.RegisterWaitForSingleObject(
handle,
(state, timedOut) => ((TaskCompletionSource <bool>)state !).TrySetResult(!timedOut),
state: tcs,
millisecondsTimeout,
executeOnlyOnce: true);
return(await tcs.Task);
}
finally
{
registeredHandle?.Unregister(null);
}
}