Ответ 1
RegisterWaitForSingleObject
объединяет ожидания на выделенные потоки официанта, каждый из которых может ждать на нескольких дескрипторах (в частности, 63 из них, MAXIMUM_WAIT_OBJECTS
минус один для дескриптора управления).
Итак, вы должны иметь возможность использовать что-то вроде этого (предупреждение: untested):
public static class WaitHandleExtensions
{
public static Task AsTask(this WaitHandle handle)
{
return AsTask(handle, Timeout.InfiniteTimeSpan);
}
public static Task AsTask(this WaitHandle handle, TimeSpan timeout)
{
var tcs = new TaskCompletionSource<object>();
var registration = ThreadPool.RegisterWaitForSingleObject(handle, (state, timedOut) =>
{
var localTcs = (TaskCompletionSource<object>)state;
if (timedOut)
localTcs.TrySetCanceled();
else
localTcs.TrySetResult(null);
}, tcs, timeout, executeOnlyOnce: true);
tcs.Task.ContinueWith((_, state) => ((RegisteredWaitHandle)state).Unregister(null), registration, TaskScheduler.Default);
return tcs.Task;
}
}