/
dev-npgsql
/
npgsql
Обзор
Документация
Войти
/
dev-npgsql
/
npgsql
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
v8.0.6
src/Npgsql/Shims/WaitHandleExtensions.cs
42 строки
2 KB
Nino Floris
Remove no sync context scope and add ConfigureAwait(false) (#5225)
26 сен 2023, 22:17
Не верифицирован
26 сен 2023, 22:17
8d51d1c
Код
Авторство
О чём код?
#if NETSTANDARD2_0 using System.Threading.Tasks; // ReSharper disable once CheckNamespace namespace System.Threading { // https://thomaslevesque.com/2015/06/04/async-and-cancellation-support-for-wait-handles/ static class WaitHandleExtensions { 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.ConfigureAwait(false); } finally { registeredHandle?.Unregister(null); } } internal static Task<bool> WaitOneAsync(this WaitHandle handle, TimeSpan timeout, CancellationToken cancellationToken = default) => handle.WaitOneAsync((int)timeout.TotalMilliseconds, cancellationToken); internal static Task<bool> WaitOneAsync(this WaitHandle handle, CancellationToken cancellationToken = default) => handle.WaitOneAsync(Timeout.Infinite, cancellationToken); } } #endif